Как установить цель в LSTM для классификации видео - PullRequest
1 голос
/ 10 июня 2019

Пожалуйста, смотрите следующий код для создания сети LSTM:

NumberofClasses=8
model = Sequential()
model.add(LSTM(256,dropout=0.2,input_shape=(32,
                 512),return_sequences=False))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(NumberofClasses, activation='softmax'))
print(model.summary())
sgd = SGD(lr=0.00005, decay = 1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics= 
['accuracy'])

callbacks = [EarlyStopping(monitor='val_loss', patience=10, verbose=1), 
ModelCheckpoint('video_1_LSTM_1_1024.h5', monitor='val_loss', 
save_best_only=True, verbose=1 ) ]
nb_epoch = 500
model.fit(train_data,train_labels,validation_data,validation_labels,batch_size,nb_epoch,callbacks,shuffle=False,verbose=1)

В приведенном выше коде я создаю LSTM с использованием библиотеки Python Keras, в моих данных содержится образец из 131 видео, относящихся к 8 различным классам. Я установил последовательность кадров из 32 кадров для каждого видео (таким образом, каждое видео имеет 32 кадра и, следовательно, 131 видео, сгенерированных 4192 кадров). Я извлек особенности из предварительно обученной модели VGG16 для каждого из этих кадров. Я создал набор данных поезда, добавив каждую из этих извлеченных функций в массив. он сформировал окончательный массив из 4192,512 измерений. соответствующий train_labels содержит одно горячее кодирование для каждого из восьми классов и имеет размерность 4192,8. Однако, поскольку LSTM требуется форма входного сигнала (выборки, временная метка и особенность), а каждое видео в моем случае имеет последовательность из 32 кадров, поэтому я преобразовал обученные данные в [131,32,512] и применил такое же преобразование на train_labels. Однако, когда я запускаю это, я получаю следующую ошибку:

 ValueError: Error when checking target: expected dense_2 to have 2 dimensions, but got 
 array with shape (131, 32, 8)

Если я не изменю форму train_labels и оставлю его как (4192,8), ошибка будет:

 ValueError: Input arrays should have the same number of samples as target 
 arrays. Found 131 input samples and 4192 target samples.

обратите внимание, что поскольку каждое из моих видео имеет длину последовательности 32 кадра, я применил это изменение формы [131,32,512] для обучения данных и (131, 32, 8) для соответствующих меток. Буду признателен за любые комментарии или советы, чтобы решить эту проблему

1 Ответ

0 голосов
/ 10 июня 2019

В классификации видео у вас обычно есть одна метка для всего видео, что означает, что в вашем случае метки должны иметь форму (131, 8).

Если у вас есть метки как (131, 32, 8), это означает, что у вас есть 131 сэмпл, у каждого сэмпла есть 32 временных шага, и у каждого временного шага есть 8 классов, так что в этом случае есть одна метка для каждого временного шага, и это не классификация видео , Модель может сделать это, но вам нужно внести некоторые изменения в LSTM, чтобы это работало.

Если вы хотите классифицировать каждый временной шаг, вам следует использовать return_sequences=True в вашем LSTM, например:

model = Sequential()
model.add(LSTM(256,dropout=0.2,input_shape=(32,
                 512),return_sequences=True))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(NumberofClasses, activation='softmax'))

Вы можете проверить, как форма вывода модели изменилась с помощью model.summary()

...