2017-02-10 24 views
3

Я новичок в Keras, и пытается реализовать эту сеть, enter image description hereИспользование Stateful LSTM с мини-дозированием и ввода с переменными шагами времени, в Keras?

эта сеть занимает видеокадры, как х = {x1, ........, хт}, где T это число кадры в видео и х являются визуальными особенностями кадров размера 2048

я попытался использовать динамическую LSTM как каждый образец имеет некоторое количество кадров в реферируемом here

и это моя модель

x = Input(batch_shape=(1, None, 2048), name='x') 
lstmR = LSTM(256, return_sequences=True, name='lstmR', stateful=True)(x) 
lstmL = LSTM(256, return_sequences=True, go_backwards=True,name='lstmL', stateful=True)(x) 
merge = merge([x, lstmR, lstmL], mode='concat', name='merge') 
dense = Dense(256, activation='sigmoid', name='dense')(merge) 
y = Dense(1, activation='sigmoid', name='y')(dense) 
model = Model(input=x, output=y) 
model.compile(loss='mean_squared_error', 
      optimizer=SGD(lr=0.01), 
      metrics=['accuracy']) 

и попытался обучить модель с помощью мини-пакетирование

for epoch in range(15): 
    mean_tr_acc = [] 
    mean_tr_loss = [] 
    for i in range(nb_samples): 
     x, y = get_train_sample(i) 
     for j in range(len(x)): 
      sample_x = x[j] 
      tr_loss, tr_acc = model.train_on_batch(np.expand_dims(np.expand_dims(sample_x, axis=0), axis=0),np.expand_dims(y, axis=0)) 
      mean_tr_acc.append(tr_acc) 
      mean_tr_loss.append(tr_loss) 
     model.reset_states() 

, но кажется, что модель не может сходиться, поскольку это дает 0,3 точность

Я также попытался это сделать с лицом без LSTM с входной формы (None, 1024), но он тоже не сместился

ответ

0

Я думаю, что ваш LSTM не может извлечь из видеофрагментов соответствующие функции, чтобы достичь хорошей точности.

Подход, который обычно дает наилучшие результаты при работе с изображениями (или видеокадрами), - это извлечение функций со стеком слоев свертки + relu + max (см. https://arxiv.org/abs/1612.02903, который является обзором распознавания лиц, все они используют свертки для извлечения полезных функций из изображений).

Эти работы лучше всего подходят для двумерного ввода, но я вижу, что вы представляете видеокадр с массивом размером 2048 вместо матрицы. Обычно изображения представлены с формой, подобной (rows, cols, color_channels).

В вашем случае вход будет иметь форму (1, None, rows, cols, color_channels), то сверток будет выглядеть примерно так:

from keras.layers import Input, LSTM, Conv2D, MaxPool2D, TimeDistributed, Flatten 

x = Input(batch_shape=(1, None, rows, cols, color_channels), name='x') 
convs = TimeDistributed(Conv2D(16, kernel_size=(3,3), activation='relu', padding='same'))(x) 
convs = TimeDistributed(MaxPool2D(pool_size=(2,2)))(convs) 
convs = TimeDistributed(Conv2D(32, kernel_size=(3,3), activation='relu', padding='same'))(convs) 
convs = TimeDistributed(MaxPool2D(pool_size=(2,2)))(convs) 
lstm_input = TimeDistributed(Flatten())(convs) 
lstmR = LSTM(256, return_sequences=True, name='lstmR', stateful=True)(lstm_input) 
lstmL = LSTM(256, return_sequences=True, go_backwards=True, name='lstmL', stateful=True)(lstm_input) 
... 

Где TimeDistrubuted относится данный слой на каждый шаг по времени.