【问题标题】:Stateful LSTM: When to reset states?有状态 LSTM:何时重置状态?
【发布时间】:2017-08-10 21:08:13
【问题描述】:

给定 X 尺寸为 (m 个样本,n 个序列和 k 个特征),以及 y 个尺寸为 (m样本,0/1)

假设我想训练一个有状态的 LSTM(按照 keras 的定义,其中“有状态 = True”意味着在每个样本的序列之间不会重置单元状态——如果我错了,请纠正我!),应该是状态以每个时期每个样本为基础进行重置?

例子:

for e in epoch:
    for m in X.shape[0]:          #for each sample
        for n in X.shape[1]:      #for each sequence
            #train_on_batch for model...
            #model.reset_states()  (1) I believe this is 'stateful = False'?
        #model.reset_states()      (2) wouldn't this make more sense?
    #model.reset_states()          (3) This is what I usually see...

总之,我不确定是否在每个序列或每个 epoch 之后重置状态(在所有 m 个样本都在 X 中训练之后)。

非常感谢您的建议。

【问题讨论】:

    标签: python machine-learning keras lstm recurrent-neural-network


    【解决方案1】:

    如果您使用 stateful=True,您通常会在每个 epoch 结束时或每隔几个样本重置状态。如果你想在每次采样后重置状态,那么这相当于只使用stateful=False

    关于您提供的循环:

    for e in epoch:
        for m in X.shape[0]:          #for each sample
            for n in X.shape[1]:      #for each sequence
    

    注意X的尺寸不完全

     (m samples, n sequences, k features)
    

    维度其实是

    (batch size, number of timesteps, number of features)
    

    因此,您不应该有内部循环:

    for n in X.shape[1]
    

    现在,关于循环

    for m in X.shape[0]
    

    由于批次的枚举是在 keras 中自动完成的,因此您不必也实现此循环(除非您想每隔几个样本重置一次状态)。因此,如果您只想在每个 epoch 结束时重置,则只需要外部循环。

    以下是此类架构的示例(取自this blog post):

    batch_size = 1
    model = Sequential()
    model.add(LSTM(16, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(y.shape[1], activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    for i in range(300):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=2, shuffle=False)
        model.reset_states()
    

    【讨论】:

    • 所以“有状态”实际上可以找到样本之间的关系,给定序列长度(也称为时间步长)和特征......如果样本中的序列数量不均匀怎么办?我想我可以填充 X_train,但这在较小的序列上可能会很昂贵。谢谢米里亚姆!
    • 是的,在这种情况下,填充似乎是一个合理的解决方案。您可以在此处的讨论中了解更多信息:github.com/fchollet/keras/issues/85
    • 如何重置 model.evaluate 中的状态?
    • @MiriamFarber stateful 找到什么样的关系? Keras 中的状态与 RNN(LSTM)中使用的状态不同吗?请提供一些参考资料,以了解 Andy 所讨论的关系。
    【解决方案2】:

    另外,自定义回调似乎是可能的。这避免了在代价高昂的循环中调用fit。类似于Tensorflow LSTM/GRU reset states once per epoch and not for each new batch

    gru_layer = model.layers[1]
    
    class CustomCallback(tf.keras.callbacks.Callback):
       def __init__(self, gru_layer):
            self.gru_layer = gru_layer
       def on_epoch_end(self, epoch, logs=None):
            self.gru_layer.reset_states()
            
    model.fit(train_dataset, validation_data=validation_dataset, \
        epochs=EPOCHS, callbacks = [EarlyS, CustomCallback(gru_layer)], verbose=1)
    

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2016-12-06
      • 1970-01-01
      • 2017-08-31
      • 2016-11-09
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多