Я пытаюсь обучить сверточный 2D LSTM делать категориальные прогнозы на основе видеоданных. Однако мой выходной слой, похоже, столкнулся с проблемой:
"ValueError: Ошибка при проверке цели: ожидалось, что плотный_1 будет иметь 5 измерений, но получен массив с формой (1, 1939, 9)"
Моя текущая модель основана на предоставленном примере ConvLSTM2D. пользователя Keras Team. Я считаю, что указанная выше ошибка является результатом моего неправильного понимания примера и его основных принципов.
Данные
У меня есть произвольное количество видео, где каждое видео содержит произвольное количество кадров. Каждый кадр имеет размер 135x240x1 (последние цветовые каналы). Это приводит к форме ввода (None, None, 135, 240, 1), где два значения «None» - это размер пакета и временные шаги в указанном порядке. Если я тренируюсь на одном видео с 1052 кадрами, моя входная форма становится (1, 1052, 135, 240, 1).
Для каждого кадра модель должна прогнозировать значения от 0 до 1 по 9 классам. Это означает, что моя выходная форма - (Нет, Нет, 9). Если я тренируюсь на одном видео с 1052 кадрами, тогда эта форма становится (1, 1052, 9).
Модель
Layer (type) Output Shape Param #
=================================================================
conv_lst_m2d_1 (ConvLSTM2D) (None, None, 135, 240, 40 59200
_________________________________________________________________
batch_normalization_1 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
conv_lst_m2d_2 (ConvLSTM2D) (None, None, 135, 240, 40 115360
_________________________________________________________________
batch_normalization_2 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
conv_lst_m2d_3 (ConvLSTM2D) (None, None, 135, 240, 40 115360
_________________________________________________________________
batch_normalization_3 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
dense_1 (Dense) (None, None, 135, 240, 9) 369
=================================================================
Total params: 290,769
Trainable params: 290,529
Non-trainable params: 240
Исходный код
model = Sequential()
model.add(ConvLSTM2D(
filters=40,
kernel_size=(3, 3),
input_shape=(None, 135, 240, 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(Dense(
units=classes,
activation='softmax'
))
model.compile(
loss='categorical_crossentropy',
optimizer='adadelta'
)
model.fit_generator(generator=training_sequence)
Отслеживание
Epoch 1/1
Traceback (most recent call last):
File ".\lstm.py", line 128, in <module>
main()
File ".\lstm.py", line 108, in main
model.fit_generator(generator=training_sequence)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\models.py", line 1253, in fit_generator
initial_epoch=initial_epoch)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 2244, in fit_generator
class_weight=class_weight)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 1884, in train_on_batch
class_weight=class_weight)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 1487, in _standardize_user_data
exception_prefix='target')
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking target: expected dense_1 to have 5 dimensions, but got array with shape (1, 1939, 9)
Образец формы ввода, напечатанный с размером пакета, равным 1, - (1, 1389, 135, 240, 1). Эта форма соответствует требованиям, которые я описал выше, поэтому я считаю, что мой подкласс Keras Sequence (в исходном коде как «training_sequence») правильный.
Я подозреваю, что проблема вызвана моим прямым переходом от BatchNormalization () к Dense (). В конце концов, трассировка указывает на то, что проблема возникает в плотном_1 (последнем слое). Тем не менее, я не хочу никого сбивать с пути своими знаниями на начальном уровне, поэтому, пожалуйста, отнеситесь к моей оценке с долей скептицизма.
Изменить 27 марта 2018 г.
Прочитав этот поток, в котором используется аналогичная модель, я изменил свой последний слой ConvLSTM2D так, чтобы для параметра return_sequences было установлено значение False вместо True. Я также добавил слой GlobalAveragePooling2D перед слоем Dense. Обновленная модель выглядит следующим образом:
Layer (type) Output Shape Param #
=================================================================
conv_lst_m2d_1 (ConvLSTM2D) (None, None, 135, 240, 40 59200
_________________________________________________________________
batch_normalization_1 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
conv_lst_m2d_2 (ConvLSTM2D) (None, None, 135, 240, 40 115360
_________________________________________________________________
batch_normalization_2 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
conv_lst_m2d_3 (ConvLSTM2D) (None, 135, 240, 40) 115360
_________________________________________________________________
batch_normalization_3 (Batch (None, 135, 240, 40) 160
_________________________________________________________________
global_average_pooling2d_1 ( (None, 40) 0
_________________________________________________________________
dense_1 (Dense) (None, 9) 369
=================================================================
Total params: 290,769
Trainable params: 290,529
Non-trainable params: 240
Вот новая копия трассировки:
Traceback (most recent call last):
File ".\lstm.py", line 131, in <module>
main()
File ".\lstm.py", line 111, in main
model.fit_generator(generator=training_sequence)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\models.py", line 1253, in fit_generator
initial_epoch=initial_epoch)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 2244, in fit_generator
class_weight=class_weight)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 1884, in train_on_batch
class_weight=class_weight)
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 1487, in _standardize_user_data
exception_prefix='target')
File "C:\Users\matth\Anaconda3\envs\capstone-gpu\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (1, 1034, 9)
На этом прогоне я распечатал формы x и y. x был (1, 1034, 135, 240, 1), а y был (1, 1034, 9). Это может сузить проблему. Похоже, проблема связана с данными y, а не данными x. В частности, слою Dense не нравится временное затемнение. Однако я не знаю, как исправить эту проблему.
Изменить 28 марта 2018 г.
Решение Ю-Яна сработало. Для тех, кто столкнулся с подобной проблемой и хочет увидеть, как выглядела окончательная модель, вот краткое изложение:
Layer (type) Output Shape Param #
=================================================================
conv_lst_m2d_1 (ConvLSTM2D) (None, None, 135, 240, 40 59200
_________________________________________________________________
batch_normalization_1 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
conv_lst_m2d_2 (ConvLSTM2D) (None, None, 135, 240, 40 115360
_________________________________________________________________
batch_normalization_2 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
conv_lst_m2d_3 (ConvLSTM2D) (None, None, 135, 240, 40 115360
_________________________________________________________________
batch_normalization_3 (Batch (None, None, 135, 240, 40 160
_________________________________________________________________
average_pooling3d_1 (Average (None, None, 1, 1, 40) 0
_________________________________________________________________
reshape_1 (Reshape) (None, None, 40) 0
_________________________________________________________________
dense_1 (Dense) (None, None, 9) 369
=================================================================
Total params: 290,769
Trainable params: 290,529
Non-trainable params: 240
Также исходный код:
model = Sequential()
model.add(ConvLSTM2D(
filters=40,
kernel_size=(3, 3),
input_shape=(None, 135, 240, 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(AveragePooling3D((1, 135, 240)))
model.add(Reshape((-1, 40)))
model.add(Dense(
units=9,
activation='sigmoid'))
model.compile(
loss='categorical_crossentropy',
optimizer='adadelta'
)
return_sequences=True
в вашем последнемConvLSTM2D
слое. - person Yu-Yang   schedule 28.03.2018GlobalAveragePooling2D()
наAveragePooling3D((1, 135, 240))
плюсReshape((-1, 40))
, чтобы форма вывода была совместима с целевым массивом. - person Yu-Yang   schedule 28.03.2018tensorflow==1.7.0rc1
(скомпилировано из исходного кода, поэтому имя пакета не содержит gpu) и Keras в последней основной ветке (установка pip из GitHub). - person Yu-Yang   schedule 28.03.2018