我有六个不同的Sequnstial
Keras模型,我希望像下面这样将它们连接起来:
模型
activation = 'tanh'model1 = Sequential()model1.add(Dense(3, input_dim=3, activation=activation))model1.add(Dense(3, activation=activation))model1.add(Dense(1))model2 = Sequential()model2.add(Dense(3, input_dim=3, activation=activation))model2.add(Dense(3, activation=activation))model2.add(Dense(1))model3 = Sequential()model3.add(Dense(1, input_dim=1, activation=activation))model3.add(Dense(1, activation=activation))model3.add(Dense(1))model4 = Sequential()model4.add(Dense(6, input_dim=6, activation=activation))model4.add(Dense(3, activation=activation))model4.add(Dense(1))model5 = Sequential()model5.add(Dense(2, input_dim=2, activation=activation))model5.add(Dense(2, activation=activation))model5.add(Dense(1))model6 = Sequential()model6.add(Dense(6, input_dim=6, activation=activation))model6.add(Dense(4, activation=activation))model6.add(Dense(1))
连接
model_concat = concatenate([model1.output, model2.output, model3.output, model4.output, model5.output, model6.output])composed_model = Model( inputs=[model1.input, model2.input, model3.input, model4.input, model5.input, model6.input], outputs=model_concat)composed_model.compile(optimizer=SGD(lr=0.001), loss='mse')
所有模型的输出维度都是1,但模型的输入维度不同。上述代码将完全运行而不会出现任何错误。
现在,问题在于训练模型。我将尝试运行以下代码以使用一个数据实例训练模型(每个子数组的维度等于相应模型的输入维度):
x_input = [[[-50.0, -50.0, 10.0], [-10.0, -20.0, 30.0], \ [20.0], [10.0, 10.0, 10.0, 10.0, 10.0, 10.0], [50.0, 50.0],\ [10.0, 10.0, 10.0, 10.0, 10.0, 10.0]]]y_output = [[1.0, 1.0, 1.0, 1.0,1.0,1.0]]composed_model.fit(x_input, y_output)
然而,我遇到了以下错误:
ValueError: 无法将NumPy数组转换为张量(不支持的对象类型列表)。
我找到了一篇相关的帖子,但它并没有解决我的问题。
回答:
据我所知,我们不能简单地在fit
方法中将所有可变大小的输入一起传递给多输入模型。你传递训练对的方式,模型肯定无法解包到相应的输入层。你提到的相关帖子也是一个需要考虑的重要事实。
然而,在tensorflow
中,我们可以使用tf.ragged.RaggedTensor
来处理变长输入序列,这在这里有讨论。但不确定是否可以通过转换为ragged tensor来找到任何解决方法。如果单个输入层接受不同长度的输入序列,这可能会成为可能。
如果你阅读了fit方法的训练对输入,你会看到keras
期望x
参数如下:
Argumentsx: 输入数据。它可以是: 1. 一个NumPy数组(或类数组),或者一个数组列表(如果模型有多个输入)。 2. 一个TensorFlow张量,或者一个张量列表(如果模型有多个输入)。 3. 一个字典,将输入名称映射到相应的数组/张量,如果模型有命名输入。......
对于你的情况,选择第三种方式非常方便,即传递字典映射的输入名称和训练对。这是我们可以做到的一种方法。首先为每个模型的输入层设置一些名称。我们设置model1
、model2
等。