2017-02-10 80 views
3

我在Keras是新,并试图执行此网络 enter image description here在Keras中使用有状态的LSTM与微型配料和可变时间步长的输入?

该网络需要一个视频帧为x = {X1,........,XT}其中T是数量在视频和x中的帧是帧的视觉特征尺寸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']) 

,并试图使用mini-配料

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做到这一点(没有,1024),但它并没有收敛太

回答

0

我认为你的LSTM不能从视频帧中提取相关的功能,以实现一个很好的准确性。

处理图像(或视频帧)时通常会给出最佳结果的方法是使用一叠卷积+卷积+最大池化层来提取特征(请参阅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应用层给出每次一步。