【问题标题】:Need clarification of TimeDistributed(dense()) with LSTM in many-to-many scenario需要在多对多场景中使用 LSTM 澄清 TimeDistributed(dense())
【发布时间】:2017-03-28 15:03:53
【问题描述】:

我是 RNN 和 keras 的新手。

我正在尝试比较 LSTM 与传统机器学习算法(如 RF 或 GBM)在序列数据(不一定是时间序列,而是按顺序)上的性能。我的数据包含 276 个预测变量和一个输出(例如,具有 276 个股票公司各种信息的股票价格)和 8564 个追溯观察。由于 LSTM 在捕捉顺序趋势方面非常出色,我决定使用 300 的 time_step。从下图中,我相信我的任务是创建一个多对多网络(左起最后一个图)。 (图:http://karpathy.github.io/2015/05/21/rnn-effectiveness/

每个粉色盒子的大小为 276(预测变量数)和 300(time_steps)这样的粉色盒子在一批中。但是,我很难看到我如何在这里设计蓝色盒子,因为每个蓝色盒子都应该是输出(股票价格)每个实例。从 Keras gihub 论坛 #2403#2654 上的其他帖子,我想我必须实现 TimeDistributed(Dense()) 但我不知道如何。这是我检查它是否有效的代码(train_idv 是要预测的数据,train_dv 是股票价格)

train_idv.shape
#(8263, 300, 276)
train_dv.shape
#(8263, 300, 1)
batch_size = 1
time_Steps=300
model = Sequential()

model.add(LSTM(300,
        batch_input_shape=(batch_size, time_Steps, train_idv.shape[2]),
        stateful=True, 
        return_sequences=True))
model.add(Dropout(0.3))

model.add(TimeDistributed(Dense(300))) 

# Model Compilation
model.compile(loss='mean_squared_error',optimizer='adam',metrics=['accuracy'])

model.fit(train_idv, traindv, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)

运行 model.fit 会出现此错误

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“/home/user/.local/lib/python2.7/site-packages/keras/models.py”,第 627 行,适合 样品重量=样品重量) 文件“/home/user/.local/lib/python2.7/site-packages/keras/engine/training.py”,第 1052 行,适合 批次大小=批次大小) _standardize_user_data 中的文件“/home/user/.local/lib/python2.7/site-packages/keras/engine/training.py”,第 983 行 exception_prefix='模型目标') 文件“/home/user/.local/lib/python2.7/site-packages/keras/engine/training.py”,第 111 行,位于standardize_input_data 字符串(数组。形状)) 异常:检查模型目标时出错:预期 timedistributed_4 的形状为 (1, 300, 300) 但得到的数组的形状为 (8263, 300, 1)

现在,我使用 time_step=1 成功运行了它,并且仅使用 Dense(1) 作为最后一层。但我不确定我应该如何塑造我的 train_dv(训练中的输出)或如何正确使用 TimeDistributed(Dense())。最后,我想用

trainPredict = model.predict(train_idv,batch_size=1)

预测任何数据的分数。

我也在 keras github 论坛上发布了this question

【问题讨论】:

  • 我会小心使用 TimeDistributed(Dense)。尽管它在模型的某些部分(例如 LSTM 之间)是必不可少的,但我发现如果用作最后一层,它似乎会破坏损失计算。有关相关问题,请参阅 github 上的 Keras:github.com/fchollet/keras/issues/8055

标签: theano keras recurrent-neural-network lstm keras-layer


【解决方案1】:

从您的帖子中,我了解到您希望每个 LSTM 时间步长预测单个标量是否正确?那么你的时间分布密集层应该有输出 1,而不是 300(即TimeDistributed(Dense(1)))。

另外供您参考,在 keras 存储库中有一个使用 Time Distributed Dense 的示例。

在这个例子中,基本上想为每个时间步训练一个多类分类器(具有共享权重),其中不同的可能类是不同的可能数字字符:

# For each of step of the output sequence, decide which character should be chosen
model.add(TimeDistributed(Dense(len(chars))))

时间步数由前面的循环层定义。

【讨论】:

  • 感谢@cortex 的帮助,网络现在正在运行,性能有所提高。
猜你喜欢
  • 2022-06-10
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多