Как кормить особенности извлеченных кадров видео в LSTM?
Я хочу сделать обнаружение аномалий на основе тысячи видео. Я извлек особенности всех кадров всех видео (используя VGG16). Теперь у меня есть все в нескольких файлах, соответствующих каждому видео.
Когда я загружаю файл с моего диска, я получаю np.ndarray формы (nb_frames, 25088). Компонент 25088 соответствует выходу VGGNet16 при выравнивании (выход VGG16: 1x7x7x512).
Я хочу кормить LSTM K кадрами по K кадрам. Тем не менее, прошло уже несколько дней, как я пытаюсь, но сейчас я в отчаянии и не могу заставить его работать...
self.model = Sequential()
# LSTM needs 3 dimensional data (nb_samples, timesteps, input_dim)
self.model.add(CuDNNLSTM(32, return_sequences=True, batch_input_shape=(BATCH_SIZE, SIZE_WINDOW, 25088)))
self.model.add(Dropout(0.2))
self.model.add(Dense(1, activation='softmax'))
self.model.compile(loss='binary_crossentropy', optimizer="rmsprop", metrics=['accuracy'])
self.model.summary()
for (X_train, y_train) in self.batch_generator():
self.model.fit(X_train, y_train, epochs=10)
И вот мой генератор:
def batch_generator(self):
# for all feature extracted files
for video in self.videos:
# videos[0] contains the path to the file
# videos[1] contains the target (abnormal or not)
x_train = np.load(video[0]) # load the video's features from disk
nb_frames = x_train.shape[0]
data = x_train.shape[1]
# I've seen on stackru I have to do that...
x_train = x_train.reshape(nb_frames, data, 1)
# The target is defined at video level, not frame level, then the same y is applied for all frame of
# current video
y_train = np.array([video[1]] * nb_frames)
# the output shape (the output *shape* is 2 dimensional according to someone on stackru)
y_train = y_train.reshape(y_train.shape[0], 1)
nb_windows = len(x_train) // SIZE_WINDOW
for window_index in range(0, nb_windows):
start = window_index * SIZE_WINDOW
end = (window_index + 1) * SIZE_WINDOW
yield x_train[start:end], y_train[start:end]
Я получаю ошибку:
ValueError: Error when checking input: expected cu_dnnlstm_input
to have shape (30, 25088) but got array with shape (25088, 1)
30 - это номер кадра, который я хочу обработать в LSTM.
Кроме того, всякий раз, когда я пытаюсь изменить порядок компонентов, я получаю ту же ошибку, но с разными значениями...
Изменить: вот мой код, если я применяю решение первого ответа. Но это дает мне ValueError, не может изменить форму:
for window_index in range(0, nb_windows):
start = window_index * SIZE_WINDOW
end = (window_index + 1) * SIZE_WINDOW
chunk = np.array(x_train[start:end])
chunk = chunk.reshape(int(nb_frames / SIZE_WINDOW), SIZE_WINDOW, data)
yield chunk, y_train[start:end]
Даже если я сделаю это здесь, ошибка останется:
[...]
# I've seen on stackru I have to do that...
# x_train = x_train.reshape(nb_frames, data, 1)
x_train = x_train.reshape(int(nb_frames / SIZE_WINDOW), SIZE_WINDOW, data)
[...]
1 ответ
Изменить форму:
x_train = x_train[:len(x_train)-(x_train%SIZE_WINDOW)]
x_train = x_train.reshape(int(nb_frames/SIZE_WINDOW), SIZE_WINDOW, data)
Извините, это моя ошибка