gpt4 book ai didi

deep-learning - 在 Keras 中使用带小批量的有状态 LSTM 和可变时间步长的输入?

转载 作者:行者123 更新时间:2023-12-04 05:36:27 24 4
gpt4 key购买 nike

我是 Keras 的新手,正在尝试实现这个网络 enter image description here

该网络将视频帧作为 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'])

并尝试使用小批量训练模型

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 的精度

我也尝试用输入形状为 (None,1024) 的无状态 LSTM 来做,但它也没有收敛

最佳答案

我认为您的 LSTM 无法从视频帧中提取相关特征以达到良好的准确性。

在处理图像(或视频帧)时通常会给出最佳结果的方法是使用卷积层 + relu + 最大池化层的堆栈来提取特征(参见 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 将给定层应用于每个时间步。

关于deep-learning - 在 Keras 中使用带小批量的有状态 LSTM 和可变时间步长的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com