Keras Stateful LSTM получает низкую точность при тестировании на обучающем наборе

Обычно я использую 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
___________________________________

person Ren    schedule 11.12.2018    source источник
comment
Это просто переоснащение (и не связано с программированием).   -  person Dr. Snoopy    schedule 11.12.2018
comment
@MatiasValdenegro Спасибо за комментарий. Однако на самом деле я тестирую на обучающем наборе, а не на проверочном ... Вы все еще думаете, что это проблема переобучения?   -  person Ren    schedule 11.12.2018


Ответы (1)


Хорошо, вот в чем проблема: похоже, что в моем коде (LSTM с отслеживанием состояния) ошибка обучения на самом деле не подразумевает реальной ошибки обучения. Другими словами, необходимо больше итераций, прежде чем модель сможет хорошо работать на проверочном наборе (до того, как модель действительно обучится). В общем, это глупая ошибка: P

person Ren    schedule 08.01.2019