我有2个代码段。其中一个训练模型,而另一个则不。我不想在不深入探讨这个问题的情况下就在Github上提出问题,这浪费了我的一天,等待着训练不正确的模型。
这是模型,是正确的。运行tensorflow 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))
此错误代码段的输出与正确的代码段日志相同,只是对于12个时间段,精度保持在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 stackoverflow post,它指出提早停止会影响模型的学习方式,但它们会因每个时代的理论而脱离话题。我尝试设置
batch_size
,但这无济于事,或者我做不正确,因为它反过来取决于亚当的学习速度,而且我的天分一定已经关闭。我在一定程度上了解了深层网络和机器学习,但这与输出之间的差异太大。我希望它可以避免其他面临类似错误的人浪费过多的时间像我一样!
有人可以详细说明一下吗。任何帮助深表感谢!
最佳答案
从我们在评论中的讨论来看,似乎问题出在当使用model.fit()
调用epochs > 1
时Adam优化器的实现未能更新任何内容时。
我想知道为什么会这样,但是目前(较慢)的解决方案是在调用optimizer=rmsprop
时使用optimizer=adam
而不是model.compile()
。
关于python - Tensorflow Keras LSTM不接受培训-受number_of_epochs和Optimizer Adam的影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52522590/