J'ai le code suivant dans Keras (Fondamentalement, je modifie ce code pour mon usage) et j'obtiens cette erreur:
'ValueError: Erreur lors de la vérification de la cible: conv3d_3 devrait avoir 5 dimensions, mais le tableau a la forme (10, 4096)'
Code:
from keras.models import Sequential
from keras.layers.convolutional import Conv3D
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.normalization import BatchNormalization
import numpy as np
import pylab as plt
from keras import layers
# We create a layer which take as input movies of shape
# (n_frames, width, height, channels) and returns a movie
# of identical shape.
model = Sequential()
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
input_shape=(None, 64, 64, 1),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(Conv3D(filters=1, kernel_size=(3, 3, 3),
activation='sigmoid',
padding='same', data_format='channels_last'))
model.compile(loss='binary_crossentropy', optimizer='adadelta')
les données que je fournis sont au format suivant: [1, 10, 64, 64, 1]. Je voudrais donc savoir où je me trompe et comment voir la forme de sortie de chaque couche.
Vous pouvez obtenir la forme de sortie d'un calque en layer.output_shape
.
for layer in model.layers:
print(layer.output_shape)
Vous donne:
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 1)
Vous pouvez également imprimer le modèle en utilisant model.summary
:
model.summary()
Vous donne les détails sur le nombre de paramètres et de formes de sortie de chaque couche et une structure de modèle globale dans un joli format:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv_lst_m2d_1 (ConvLSTM2D) (None, None, 64, 64, 40) 59200
_________________________________________________________________
batch_normalization_1 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv_lst_m2d_2 (ConvLSTM2D) (None, None, 64, 64, 40) 115360
_________________________________________________________________
batch_normalization_2 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv_lst_m2d_3 (ConvLSTM2D) (None, None, 64, 64, 40) 115360
_________________________________________________________________
batch_normalization_3 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv_lst_m2d_4 (ConvLSTM2D) (None, None, 64, 64, 40) 115360
_________________________________________________________________
batch_normalization_4 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv3d_1 (Conv3D) (None, None, 64, 64, 1) 1081
=================================================================
Total params: 407,001
Trainable params: 406,681
Non-trainable params: 320
_________________________________________________________________
Si vous souhaitez accéder aux informations sur une couche spécifique uniquement, vous pouvez utiliser l'argument name
lors de la construction de cette couche, puis appeler comme ceci:
...
model.add(ConvLSTM2D(..., name='conv3d_0'))
...
model.get_layer('conv3d_0')
EDIT: Pour référence, il sera toujours le même que layer.output_shape
Et veuillez ne pas utiliser Lambda ou des couches personnalisées pour cela. Mais vous pouvez utiliser la couche Lambda
pour faire écho à la forme d'un tenseur passant.
...
def print_tensor_shape(x):
print(x.shape)
return x
model.add(Lambda(print_tensor_shape))
...
Ou écrivez un calque personnalisé et imprimez la forme du tenseur sur call()
.
class echo_layer(Layer):
...
def call(self, x):
print(x.shape)
return x
...
model.add(echo_layer())