asendjasni
asendjasni

Reputation: 1084

Getting an error with a multi-input Keras model related to the input dimension

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

Answers (1)

Poe Dator
Poe Dator

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

Related Questions