Ой! Я вижу, позвольте мне попробовать и посмотреть, если это работает для меня!

е представляют собой 10 видео, каждое из которых разделено на 86 кадров, и каждый кадр имеет 28 * 28 пикселей,

video_num = 10
frame_num = 86
pixel_num = 28*28

Я хочу использовать Conv2D + LSDM для построения модели и при каждом шаге time_steps (= frame_num = 86) отправлять данные пикселей (= INPUT_SIZE = 28 * 28) в модели. Итак, мой код о модели приведен ниже.

BATCH_SIZE = 2 (just try)
TIME_STEPS=frame_num (=86)
INPUT_SIZE=pixel_num (=28*28)

model = Sequential()
model.add(InputLayer(batch_input_shape=(BATCH_SIZE, TIME_STEPS,     
INPUT_SIZE)))
print (model.output_shape)

model.add(TimeDistributed(Conv2D(64,(1,3),strides=(1,1), padding='same', 
data_format='channels_last')))  ##always the error here
print (model.output_shape)

model.add(TimeDistributed(MaxPooling2D(pool_size=(2,2),padding='same')))
print (model.output_shape)

model.add(TimeDistributed(Conv2D(64,(1,3),strides=(1,1), 
data_format='channels_last', padding='same')))
print (model.output_shape)

model.add(TimeDistributed(MaxPooling2D(pool_size=(2,2),padding='same')))
print (model.output_shape)

model.add(TimeDistributed(Flatten()))
print (model.output_shape)

model.add(TimeDistributed(Dense(4096, activation='relu')))
print (model.output_shape)

model.add(LSTM(100, stateful=True, return_sequences=True))
print (model.output_shape)

model.add(Dense(1, activation='sigmoid'))
print (model.output_shape)

На следующем рисунке показана ошибка из командной строки

https://imgur.com/a/yAPQO говорит "индекс списка вне диапазона"

Я думаю, что ошибка связана с формой ввода в TimeDistributed (), которая получает данные из верхнего уровня (InputLayer ()), но я не знаю, как исправить ошибку. Я попытался удалить InputLayer () и использовать

TimeDistributed(Conv2D(...), input_shape=(TIME_STEPS, INPUT_SIZE))

как первый слой, но также получить ту же ошибку ...

Если кто-нибудь знает об этой ошибке, поделитесь своей идеей, буду очень признателен. Кроме того, я до сих пор не очень понимал разницу между batch_input_shape и input_shape, кто-нибудь использовал эти два раньше? Благодарю.

Ответы на вопрос(1)

Решение Вопроса

Conv2D слой требует четырех измерений, а не трех:

(batch_size, height, width, channels).

ИTimeDistributed потребуется дополнительное измерение:

(batch_size, frames, height, width, channels)

Итак, если вы действительно собираетесь работать сTimeDistributed+Conv2DВам нужно 5 измерений. Твойinput_shape=(86,28,28,3)или вашbatch_input_shape=(batch_size,86,28,28,3)где я предположил, что у вас есть видео RGB (3 цветных канала).

Обычно вы просто передаете входную формуTimeDistributed.

model.add(TimeDistributed(Dense(....), input_shape=(86,28,28,3))

Вам понадобитсяbatch_input_shape только в случае использованияstateful=True LSTM годов. Затем вы просто заменяете input_shape на batch_input_shape.

Обратите внимание, что только сверточные 2D-слои будут видеть изображения с точки зрения высоты и ширины. Когда вы добавляете LSTM, вам необходимо изменить форму данных, чтобы привести высоту, ширину и каналы в одно измерение.

Для фигуры (кадры, ч, ш, ч):

model.add(Reshape((frames,h*w*ch)))

И вы не должны использоватьTimeDistributed с этими LSTM, только со сверточными слоями.

Ваш подход к использованиюmodel.add(TimeDistributed(Flatten())) все в порядке вместо изменения формы.

Также обратите внимание, что в Керасе недавно был внедренConvLSTM2D слой, который может быть полезен в вашем случае:https://keras.io/layers/recurrent/#convlstm2d

 Edward Chang24 нояб. 2017 г., 14:20
Меня устраивает!! Большое спасибо!
 Daniel Möller24 нояб. 2017 г., 16:13
Например, если у вас черно-белое видео, то у вас есть только один канал. В массиве numpy вы можете просто изменить его. Предположим, у вас есть массивx_train с формой(10,86,28,28), Затем:x_train=x_train.reshape((10,86,28,28,1)).
 Edward Chang24 нояб. 2017 г., 14:22
Здесь я получил еще одну проблему, как сделать мои входные данные в 5D форме, которая также делает последнее измерение "каналом"
 Edward Chang24 нояб. 2017 г., 14:30
frame_all_train [video_count] [frame_count] [pixel_height_count] [pixel_width_count] = frame [pixel_height_count, pixel_width_count] Я могу только сформировать 4D-форму с моими данными, я не уверен, что как добавить еще одно измерение, потому что я не знаю, какое значение Я должен положить в 5-е измерение ...
 Edward Chang24 нояб. 2017 г., 16:31
Ой! Я вижу, позвольте мне попробовать и посмотреть, если это работает для меня!

Ваш ответ на вопрос