Ошибка при проверке цели: ожидалось, что conv2d будет иметь 4 измерения, но получил массив с формой - PullRequest
0 голосов
/ 30 ноября 2018

Я построил нейронную сеть Keras ConvLSTM и хочу прогнозировать один кадр вперед на основе последовательности из 10 временных шагов:

model = Sequential()
model.add(ConvLSTM2D(filters=128, kernel_size=(3, 3),
                   input_shape=(None, img_size, img_size, Channels),
                   padding='same', return_sequences=True))
model.add(BatchNormalization())

model.add(ConvLSTM2D(filters=64, kernel_size=(3, 3),
                   padding='same', return_sequences=True))
model.add(BatchNormalization())

model.add(ConvLSTM2D(filters=64, kernel_size=(3, 3),
                   padding='same', return_sequences=False))
model.add(BatchNormalization())


model.add(Conv2D(filters=1, kernel_size=(3, 3),
               activation='sigmoid',
               padding='same', data_format='channels_last', name='conv2d'))


model.compile(loss='binary_crossentropy', optimizer='adadelta')

Обучение:

data_train_x:(10, 10, 62, 62, 12)
data_train_y:(10, 1, 62, 62, 1)


model.fit(data_train_x, data_train_y, batch_size=10, epochs=1, 
validation_split=0.05)

Но я получаю следующую ошибку:

ValueError: Error when checking target: expected conv2d to have 4 dimensions, but got array with shape (10, 1, 62, 62, 1)

И это результаты 'model.summary ()':

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv_lst_m2d_4 (ConvLSTM2D)  (None, None, 62, 62, 128) 645632    
_________________________________________________________________
batch_normalization_3 (Batch (None, None, 62, 62, 128) 512       
_________________________________________________________________
conv_lst_m2d_5 (ConvLSTM2D)  (None, None, 62, 62, 64)  442624    
_________________________________________________________________
batch_normalization_4 (Batch (None, None, 62, 62, 64)  256       
_________________________________________________________________
conv_lst_m2d_6 (ConvLSTM2D)  (None, 62, 62, 64)        295168    
_________________________________________________________________
batch_normalization_5 (Batch (None, 62, 62, 64)        256       
_________________________________________________________________
conv2d (Conv2D)              (None, 62, 62, 1)         577       
=================================================================
Total params: 1,385,025
Trainable params: 1,384,513
Non-trainable params: 512
_________________________________________________________________

Эта модель является пересмотренной версией другой модели, которая быласкомпилировано без ошибок, то, что отличается от предыдущей модели, это только последние два слоя.Ранее это было похоже на

model.add(ConvLSTM2D(filters=64, 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', name='conv3d'))

Я внес это изменение, потому что хочу получить 4-мерный вывод формы (samples, output_row, output_col, filters)

1 Ответ

0 голосов
/ 30 ноября 2018

Сообщение об ошибке ясно.Модель ожидает, что выходной ранг равен четырем, но вы передаете выходной сигнал ранга 5. Сожмите второе измерение data_train_y, прежде чем подавать его в модель.

data_train_y = tf.squeeze(data_train_y, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...