【发布时间】:2018-08-08 19:20:00
【问题描述】:
对于我打算自发生成序列的模型,我发现逐个样本对其进行训练并保持其间的状态感觉最自然。在阅读了许多有用的资源后,我设法在 Keras 中构建了它。 (SO:Q and two fantastic answers,Macine Learning Mastery 1,2,3)
首先构造一个序列(在我的例子中也是单热编码)。通过将 Y 向前移动一个时间步长,由此序列产生 X 和 Y。训练以一个样本和一个时间步的批次进行。
对于 Keras,这看起来像这样:
data = get_some_data() # Shape (samples, features)
Y = data[1:, :] # Shape (samples-1, features)
X = data[:-1, :].reshape((-1, 1, data.shape[-1])) # Shape (samples-1, 1, features)
model = Sequential()
model.add(LSTM(256, batch_input_shape=(1, 1, X.shape[-1]), stateful=True))
model.add(Dense(Y.shape[-1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
for epoch in range(10):
model.fit(X, Y, batch_size=1, shuffle=False)
model.reset_states()
确实有效。然而,在咨询了我的任务管理器之后,它似乎只使用了我的 GPU 资源的约 10%,这已经非常有限了。我想改进这一点以加快训练速度。增加批量大小将允许并行计算。
即使从训练序列开始,网络在其当前状态下也可能会“记住”事物。对于批量训练,首先需要设置序列,然后预测一个值 - 并对多个值执行此操作。要在完整序列上进行训练,需要生成 (samples-steps, steps, features) 形状的数据。我想有一个跨越至少几百个时间步的序列并不少见。所以这将意味着数据量的巨大增加。
在稍微不同地构建问题和需要将更多数据存储在内存中以及仅使用少量处理资源之间,我必须问:
- 我对自然训练方式和状态的直觉是否正确?
- 每批一个样本的这种训练还有其他缺点吗?
- 能否通过其他方式解决利用率问题?
- 最后,是否有一种可接受的方式来执行这种训练以生成长序列?
非常感谢任何帮助,我是 LSTM 的新手。
【问题讨论】:
标签: python machine-learning neural-network keras lstm