RNN/LSTM 的非常规使用

Unconvential use of a RNN/LSTM

如果我很好理解 RNN 允许考虑序列中的最后一个值来预测下一个值。假设我想预测函数 cos(x) 的下一个值,并且我有一个数据集,其中 x 的结果在范围 (0, 1000) 内。首先,我用 cos(0) 来预测 cos(1),然后用 cos(1) 来预测 cos(2) 等等,然后在每一步调整权重,模型保留最后一个值的记忆做下一个预测。

就我而言我想训练一个模型来预测视频的质量。为此,我有一个带有注释视频的数据集。对于每个视频,对于每一帧,我计算了一组 36 个空间不相关的特征。所以输入的形状是 (nb_videos, nb_frames, 36)。对于每个视频,我都有一个代表全球视频质量的分数,标签的形状是 (nb_videos, 1).

不知道可以用哪种NN。 n_frames x 36 对于简单的多层感知器来说太大了。特征可能在时间轴上有意义,但在特征轴上没有意义,所以除非我用一维卷积训练 36 个模型,否则 CNN 是无用的。最后,特征按顺序出现,但 RNN 的问题在于它需要为序列中的每个元素打分,而模型仅用于预测该序列中的下一个值。

我的想法 是拥有 1 个针对任何视频训练的 RNN 模型。我将 36 个特征以良好的顺序输入 RNN n_frames 次,只有在这些 n_frames 次迭代之后,模型才会给出预测。然后这个预测被用来调整权重。然后我们用数据集中随机选择的视频来计算 epoch 的数量。

有道理吗?

是否存在类似的东西?

我不认为您对 RNN/LSTM 的使用非常规,而且您的想法很有道理。如果我理解正确的话,你的想法涉及使用多对一 RNN:

资料来源:http://karpathy.github.io/2015/05/21/rnn-effectiveness/

其中每个时间步的输入对应一个具有 36 个特征的帧,最后一个时间步的输出传达有关整个视频的信息。在 Keras 中,这可能类似于:

from keras.models import Sequential
from keras.layers import LSTM, Dense

nb_frames = 10

model = Sequential()
model.add(LSTM(20, input_shape=(nb_frames, 36)))
model.add(Dense(1, activation='relu'))
model.compile('rmsprop', 'mse')
model.summary()

多对一 RNN 非常常见,您不会非常规地使用它们。