【问题标题】:Keras Stateful LSTM get low accuracy when testing on training set在训练集上进行测试时,Keras Stateful LSTM 的准确率很低
【发布时间】:2019-05-12 02:49:35
【问题描述】:

通常,我使用有状态 LSTM 进行预测。当我训练 LSTM 时,输出精度非常高。但是,当我在训练集上测试 LSTM 模型时,准确率很低!这真的让我很困惑,我认为它们应该是一样的。这是我的代码和输出。有谁知道为什么会发生这样的事情?谢谢!

model = Sequential()
adam = keras.optimizers.Adam(lr=0.0001)
model.add(LSTM(512, batch_input_shape=(12, 1, 120), return_sequences=False, stateful=True))
model.add(Dense(8, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])

print 'Train...'
for epoch in range(30):
    mean_tr_acc = []
    mean_tr_loss = []
    current_data, current_label, origin_label, is_shuffled = train_iter.next()
    for i in range(current_data.shape[1]):
        if i%1000==0:
            print "current iter at {} with {} iteration".format(i, epoch)
        data_slice = current_data[:,i,:]
        # Data slice dim: [batch size = 12, time_step=1, feature_dim=120]
        data_slice = np.expand_dims(data_slice, axis=1)
        label_slice = current_label[:,i,:]
        one_hot_labels = keras.utils.to_categorical(label_slice, num_classes=8)
        last_element = one_hot_labels[:,-1,:]
        tr_loss, tr_acc = model.train_on_batch(np.array(data_slice), np.array(last_element))
        mean_tr_acc.append(tr_acc)
        mean_tr_loss.append(tr_loss)
    model.reset_states()

    print 'accuracy training = {}'.format(np.mean(mean_tr_acc))
    print 'loss training = {}'.format(np.mean(mean_tr_loss))
    print '___________________________________'

    # At here, just evaluate the model on the training dataset
    mean_te_acc = []
    mean_te_loss = []
    for i in range(current_data.shape[1]):
        if i%1000==0:
            print "current val iter at {} with {} iteration".format(i, epoch)
        data_slice = current_data[:,i,:]
        data_slice = np.expand_dims(data_slice, axis=1)
        label_slice = current_label[:,i,:]
        one_hot_labels = keras.utils.to_categorical(label_slice, num_classes=8)
        last_element = one_hot_labels[:,-1,:]
        te_loss, te_acc = model.test_on_batch(np.array(data_slice), np.array(last_element))
        mean_te_acc.append(te_acc)
        mean_te_loss.append(te_loss)
    model.reset_states()

这是程序输出:

current iter at 0 with 13 iteration
current iter at 1000 with 13 iteration
accuracy training = 0.991784930229
loss training = 0.0320105217397
___________________________________
Batch shuffled
current val iter at 0 with 13 iteration
current val iter at 1000 with 13 iteration
accuracy testing = 0.927557885647
loss testing = 0.230829760432
___________________________________

【问题讨论】:

  • 这只是过拟合(与编程无关)。
  • @MatiasValdenegro 感谢您的评论。但是,我实际上是在训练集上进行测试,而不是在验证集上进行测试……你还认为这是一个过拟合的问题吗?

标签: python tensorflow keras lstm stateful


【解决方案1】:

好的,问题来了:似乎在我的代码(有状态 LSTM)中,训练错误并不真正暗示真正的训练错误。换句话说,需要更多的迭代才能使模型在验证集上很好地工作(在模型真正训练之前)。一般来说,这是一个愚蠢的错误:P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 2018-09-18
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2013-10-01
    • 2017-10-05
    相关资源
    最近更新 更多