【问题标题】:Tensorflow Keras LSTM not training - affected by number_of_epochs, optimizer adamTensorflow Keras LSTM 未训练 - 受 number_of_epochs、优化器 a​​dam 的影响
【发布时间】:2023-12-08 02:39:01
【问题描述】:

我有 2 个代码 sn-ps。其中一个训练模型,而另一个不训练。我不想在没有深入了解的情况下在 Github 上提出问题,这浪费了我一天的时间等待不正确的模型进行训练。

这是正确的模型。运行张量流 1.10.1.

model = Sequential()
# I truncate the string at 20 characters, alphabet listset is a sorted list of the set of [A-Za-z0-9-_] which has len = 64
model.add(LSTM(512, return_sequences=True, input_shape=(20, len(alphabet_listset)), dropout=0.2, stateful=False))
model.add(LSTM(512, return_sequences=False, dropout=0.2, stateful=False))
model.add(Dense(2, activation="softmax"))
model.compile(optimizer=adam, loss='categorical_crossentropy', 
              metrics=['accuracy'])  # adam here is at learning rate 1e-3
model.summary()

要创建 X_train 和 Y_train,我使用 test_train_split。 我将字符串转换为一个热向量的方式(即使现在有一个用于 lstm 的热向量的功能,如果你添加它真的会有所帮助)是

def string_vectorizer(strng, alphabet, max_str_len=20):
    vector = [[0 if char != letter else 1 for char in alphabet] for letter in strng[0:max_str_len]]
    while len(vector) != max_str_len:
        vector = [*vector, [0 for char in alphabet]]
    return np.array(vector)

我提到的正确部分确实是正确的,因为这不是我第一次训练这个模型并对其进行验证。我需要每个月更新我的模型,当我通过运行多个模型来测试我的架构时,我遇到了这个异常。

这是错误的代码

    model.fit(X_train, to_categorical(Y_train, 2), epochs=1000,
              validation_data=(X_test, to_categorical(Y_test, 2)),
              verbose=2, shuffle=True)
    loss, accuracy = model.evaluate(X_test, to_categorical(Y_test, 2))

这个不正确的sn-p的输出和正确的sn-p log是一样的,只是12个epoch的准确率保持在0.5454,损失没有减少。我的样本数据分为 50k 正确标签和 60k 错误标签。因此,如果模型只为所有 60k 个不正确的标签预测 1,那么准确度将为 60k / (60k + 50k) => 0.54

这是正确的代码,唯一的区别是epochs的值。

expected_acc_eth, expected_loss_eth = 0.83, 0.40

while(True):
    model.fit(X_train, to_categorical(Y_train, 2), epochs=1,
              validation_data=(X_test, to_categorical(Y_test, 2)),\
              verbose=2, shuffle=True)
    loss, accuracy = model.evaluate(X_test, to_categorical(Y_test, 2))

    if((accuracy > expected_acc_eth) & (loss < expected_loss_eth)):
        break

这个正确代码的输出

Train on 99000 samples, validate on 11000 samples
Epoch 1/1
 - 1414s - loss: 0.6847 - acc: 0.5578 - val_loss: 0.6698 - val_acc: 0.5961
11000/11000 [==============================] - 36s 3ms/step
Train on 99000 samples, validate on 11000 samples
Epoch 1/1
 - 1450s - loss: 0.6777 - acc: 0.5764 - val_loss: 0.6707 - val_acc: 0.5886
11000/11000 [==============================] - 36s 3ms/step
Train on 99000 samples, validate on 11000 samples
Epoch 1/1
 - 1425s - loss: 0.6729 - acc: 0.5862 - val_loss: 0.6643 - val_acc: 0.6030
11000/11000 [==============================] - 37s 3ms/step
Train on 99000 samples, validate on 11000 samples
Epoch 1/1
 - 1403s - loss: 0.6681 - acc: 0.5948 - val_loss: 0.6633 - val_acc: 0.6092
11000/11000 [==============================] - 35s 3ms/step
Train on 99000 samples, validate on 11000 samples
Epoch 1/1

我看到this * post 指出,早期停止会影响模型的学习方式,但它们会偏离每个时代理论的步骤。我尝试设置batch_size,但这无济于事,或者我无法正确设置,因为它与亚当的学习率成反比,而且我的规模一定是关闭的。我在一定程度上了解深度网络和机器学习,但这与输出之间的差异太大了。

我希望它可以避免其他面临类似错误的人像我一样浪费太多时间!

有人可以详细说明一下吗?非常感谢任何帮助!

【问题讨论】:

  • 出于好奇,如果您使用不同的优化器,您会看到同样的问题吗?我想知道这是否特定于 Adam 优化器,或者它是否与 model.fit 处理 LSTM 的方式有关,而 epochs &gt; 1...
  • 我只试过adam和adamw。我还没有在 RMS 道具上尝试过。每个 epoch 需要 30 分钟 - 1 小时,而我的计算能力和时间有限。如果有人用 RMS 道具尝试过,请分享。这是经过训练的模型和权重github.com/devssh/GenderEthnicityDetector。 Adam 的核心是 RMS 道具 + 动量。
  • 您能否在大幅缩减的数据集上进行尝试以使其运行得更快?我熟悉 Adam 优化器的内容;使用另一个优化器进行测试可以缩小 Keras/TF 管道中您的训练可能出错的位置。
  • 是的,如果我的优化器="rmsprop" 就不会出现这个问题。 rmsprop 也比亚当慢 2 倍到 10 倍。因此,这意味着当使用 adam 进行一一拟合时,动量会丢失,从而允许模型进行训练。嗯..我想知道这是否可以使用 fit 中的 batch_size 和 LSTM 中的 input_batch_size 来解决,因为我没有使用它,并且 adam 的自定义学习率为 1e-3,rmsprop 不需要我指定。
  • 如果没有其他人回复,我想我可以接受 @Engineero 的有效回答,因为我们知道出了什么问题。谢谢!

标签: python tensorflow machine-learning keras lstm


【解决方案1】:

根据我们在 cmets 中的讨论,听起来问题出现在 Adam 优化器的实现中,当使用 epochs &gt; 1 调用 model.fit() 时无法更新任何内容。

我有兴趣了解为什么这是,但目前一个(较慢)可行的解决方案是在您对 model.compile() 的调用中使用 optimizer=rmsprop 而不是 optimizer=adam。 p>

【讨论】: