Keras。验证准确率保持完全相同,但验证损失会减少

问题描述 投票:0回答:1

我知道问题不可能出在数据集上,因为我见过其他项目使用同样的数据集,这是我的数据预处理代码。

import pandas as pd
dataset = pd.read_csv('political_tweets.csv')
dataset.head()
dataset = pd.read_csv('political_tweets.csv')["tweet"].values
y_train = pd.read_csv('political_tweets.csv')["dem_or_rep"].values

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(dataset, y_train, test_size=0.1)

max_words = 10000
print(max_words)
max_len = 25

tokenizer = Tokenizer(num_words = max_words, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n1234567890', lower=False,oov_token="<OOV>")

tokenizer.fit_on_texts(x_train)
x_train = tokenizer.texts_to_sequences(x_train)
x_train = pad_sequences(x_train, max_len, padding='post', truncating='post')

tokenizer.fit_on_texts(x_test)
x_test = tokenizer.texts_to_sequences(x_test)
x_test = pad_sequences(x_test, max_len, padding='post', truncating='post')

还有我的模型

model = Sequential([
    Embedding(max_words+1,64,input_length=max_len),
    Bidirectional(GRU(64, return_sequences = True), merge_mode='concat'),
    GlobalMaxPooling1D(),
    Dense(64,kernel_regularizer=regularizers.l2(0.02)),
    Dropout(0.5),
    Dense(1, activation='sigmoid'),

])
model.summary()

model.compile(loss='binary_crossentropy', optimizer=RMSprop(learning_rate=0.0001), metrics=['accuracy'])
model.fit(x_train,y_train, batch_size=128, epochs=500, verbose=1, shuffle=True, validation_data=(x_test, y_test))

我的两个损失都减少了,我的训练准确率增加了,但验证准确率保持在50%(考虑到我正在做一个二进制分类模型,这很糟糕)。

Epoch 1/500
546/546 [==============================] - 35s 64ms/step - loss: 1.7385 - accuracy: 0.5102 - val_loss: 1.2458 - val_accuracy: 0.5102
Epoch 2/500
546/546 [==============================] - 34s 62ms/step - loss: 0.9746 - accuracy: 0.5137 - val_loss: 0.7886 - val_accuracy: 0.5102
Epoch 3/500
546/546 [==============================] - 34s 62ms/step - loss: 0.7235 - accuracy: 0.5135 - val_loss: 0.6943 - val_accuracy: 0.5102
Epoch 4/500
546/546 [==============================] - 34s 62ms/step - loss: 0.6929 - accuracy: 0.5135 - val_loss: 0.6930 - val_accuracy: 0.5102
Epoch 5/500
546/546 [==============================] - 34s 62ms/step - loss: 0.6928 - accuracy: 0.5135 - val_loss: 0.6931 - val_accuracy: 0.5102
Epoch 6/500
546/546 [==============================] - 34s 62ms/step - loss: 0.6927 - accuracy: 0.5135 - val_loss: 0.6931 - val_accuracy: 0.5102
Epoch 7/500
546/546 [==============================] - 37s 68ms/step - loss: 0.6925 - accuracy: 0.5136 - val_loss: 0.6932 - val_accuracy: 0.5106
Epoch 8/500
546/546 [==============================] - 34s 63ms/step - loss: 0.6892 - accuracy: 0.5403 - val_loss: 0.6958 - val_accuracy: 0.5097
Epoch 9/500
546/546 [==============================] - 35s 63ms/step - loss: 0.6815 - accuracy: 0.5633 - val_loss: 0.7013 - val_accuracy: 0.5116
Epoch 10/500
546/546 [==============================] - 34s 63ms/step - loss: 0.6747 - accuracy: 0.5799 - val_loss: 0.7096 - val_accuracy: 0.5055

我看到其他关于这个话题的帖子,他们说要增加dropout、crossentropy、降低学习率等。我已经做了所有这些,但都没有用.任何帮助都非常感激.先谢谢你!

tensorflow machine-learning keras training-data loss
1个回答
2
投票

对于你的问题,我有几点看法。

  1. 虽然对数据集不是特别熟悉,但我相信它在很多情况下使用都没有问题。然而,你可以尝试检查它的平衡性。在 train_test_split() 有一个参数叫做 stratify 其中,如果喂给 y训练集和测试集中,会按比例保证每个类的样本数量相同。
  2. 你的验证损失和验证精度的现象并不是什么稀奇的事情。想象一下,在第一个纪元,神经网络以55%的置信度考虑一些GT ==1的地真正例(ys)。当训练推进时,神经网络学习得更好,现在它对GT ==1的地真正例(ys)的置信度为90%。由于计算准确率的阈值是50%。 ,在这两种情况下,你有相同的准确性。然而,损失已经显著改变,因为90% >> 55%。
  3. 你的训练似乎在进步(缓慢但肯定)。你是否考虑过使用ADAM作为现成的优化器?
  4. 如果低准确度在某个时间段内仍然保持着,那么你很可能会受到一种众所周知的现象的影响,这种现象被称为:--------。不合身在这种情况下,您的模型无法捕捉数据之间的依赖性。为了减轻避免完全的拟合不足,你可能想使用一个更复杂的模型(2个LSTMs 2个GRU)。
  5. 重复一遍数据集的预处理步骤。确保句子被正确转换。
© www.soinside.com 2019 - 2024. All rights reserved.