Reputation: 1084
I have a multi input Keras model. Here the inputs:
[<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>]
And here the input shape of the model :
[(None, 256, 256, 3),
(None, 256, 256, 3),
(None, 256, 256, 3),
(None, 256, 256, 3)]
The training data shape is as follows :
(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
When I call the fit
function:
model.fit(train_x, train_y, validation_split=0.20, epochs=5, batch_size=3)
The following error occured:
ValueError: Input 0 of layer conv1_pad_0 is incompatible with the layer: expected ndim=4, found ndim=5. Full shape received: [3, 422, 256, 256, 3]
I have tried the solution given in this post, but I got a mismatch in cardinality.
ValueError: Data cardinality is ambiguous:
I have tried passing the train data like bellow and it worked:
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)
Now If I want to scale my model to 20 inputs the above line of code will be problematique.
Update:
The model are based on the pretrained ResNet50, all inputs are a resnet50 without the top layers and begin with the following three layers :
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]
The data for training/testing the model is processed as follows:
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)
Upvotes: 0
Views: 360
Reputation: 4913
try
train_x_list = [tf.squeeze(tx) for tx in tf.split(train_x, num_or_size_splits=train_x.shape[0], axis=0)]
it will produce a list of tensors with training data split along dimension 0. Then use your second solution, feeding the list to fit()
.
Upvotes: 1