Python 获取与输入维度相关的多输入Keras模型的错误

Python 获取与输入维度相关的多输入Keras模型的错误,python,numpy,tensorflow,keras,cnn,Python,Numpy,Tensorflow,Keras,Cnn,我有一个多输入Keras模型。这里输入: [<tf.Tensor 'input_1:0' shape=(None, 256, 256, 3) dtype=float32>, <tf.Tensor 'input_2:0' shape=(None, 256, 256, 3) dtype=float32>, <tf.Tensor 'input_3:0' shape=(None, 256, 256, 3) dtype=float32>, <tf.Tenso

我有一个多输入Keras模型。这里输入:

[<tf.Tensor 'input_1:0' shape=(None, 256, 256, 3) dtype=float32>,
 <tf.Tensor 'input_2:0' shape=(None, 256, 256, 3) dtype=float32>,
 <tf.Tensor 'input_3:0' shape=(None, 256, 256, 3) dtype=float32>,
 <tf.Tensor 'input_4:0' shape=(None, 256, 256, 3) dtype=float32>]

培训数据形状如下所示:

(4, 422, 256, 256, 3)
4 = number of inputs (consist of appended arrays together).
422 = number of training images in each input.
256, 256, 3 = shape of the images
调用
fit
功能时:

model.fit(train_x, train_y, validation_split=0.20, epochs=5, batch_size=3)
发生以下错误:

ValueError:层conv1\u pad\u 0的输入0与层不兼容:预期ndim=4,发现ndim=5。收到完整形状:[3,422,256,256,3]

我尝试了中给出的解决方案,但基数不匹配

ValueError:数据基数不明确:

我试着像贝娄一样传递列车数据,结果成功了:

model.fit([train_x[0], train_x[1], train_x[2], train_x[3]], train_y, validation_split=0.20, epochs=5, batch_size=3)
现在,如果我想将我的模型扩展到20个输入,那么上面的代码行将是有问题的

更新:

该模型基于预训练的ResNet50,所有输入均为不带顶层的ResNet50,并从以下三层开始:

input_1_0 (InputLayer)        [(None, 256, 256, 3) 0  
conv1_pad_0 (ZeroPadding2D)   (None, 262, 262, 3)  0           input_1_0[0][0]
conv1_conv_0 (Conv2D)         (None, 128, 128, 64) 9472        conv1_pad_0[0][0]   
培训/测试模型的数据处理如下:

for row in np.array(tmp_data):
        row = images_preprocessing(row) # Depends on the model used
        train_x, test_x, train_y, test_y = split_data(row, target) # Here the train_test_split is used
        
        train_X.append(train_x)
        test_X.append(test_x)
        train_Y.append(train_y)
        test_Y.append(test_y)
试一试


它将生成一个张量列表,其中包含沿维度0拆分的训练数据。然后使用第二种解决方案,将列表输入到
fit()

你的人际网络的前两层是什么?@ChrisSchmitz我已经按照你的要求更新了这篇文章。你能展示一下定义它们的代码吗?另外,您的培训数据的哪个维度是示例总数/批量大小?@ChrisSchmitz I更新了帖子。您所说的示例数是什么意思?培训数据形状如下:(4422、256、256、3)。4和422在您的输入中代表什么?预训练ResNet50的输入应该有4d。谢谢你的回答,它起作用了。如果可能的话,您能解释一下为什么这样做有效,而不是简单的数组列表吗?另外,我在一个循环中训练多个模型,第一个执行得很好,但第二个,它生成了以下错误:
tensorflow.python.framework.errors\u impl.InternalError:无法从/job:localhost/replica:0/task:0/device:CPU:0复制输入张量到/job:localhost/replica:0/task:0/device:GPU:0以运行Split:Dst-tensor,但未初始化。[Op:Split]name:Split
不客气。我刚刚展示了一种分割输入数据的方法。np数组的列表可能也可以。您的另一个错误可能是内存问题:我正在努力解决另一个问题,您能看看我以前的帖子吗:
for row in np.array(tmp_data):
        row = images_preprocessing(row) # Depends on the model used
        train_x, test_x, train_y, test_y = split_data(row, target) # Here the train_test_split is used
        
        train_X.append(train_x)
        test_X.append(test_x)
        train_Y.append(train_y)
        test_Y.append(test_y)
train_x_list = [tf.squeeze(tx) for tx in tf.split(train_x, num_or_size_splits=train_x.shape[0], axis=0)]