首页 > 解决方案 > 为什么我的模型准确率停留在 ~32%?

问题描述

编辑:我看到有人对这篇文章投了反对票,请让我知道我做了什么,这样我以后就可以避免这样做了。谢谢

我对深度学习很陌生,我正在研究我的第一个基于非教程的 RNN 模型,但是我得到的结果很差。

我创建了 Anthony Fantano 的专辑评论数据集,其各自的分数目标在 1-9 之间(此处)。我的目标是使用情绪分析来根据输入文本预测分数。

首先,我使用 kerasTokenizer实用程序类来预处理我的原始文本,然后将基于标记的文本填充/截断到最大大小,np.mean(num_tokens) + 2 * np.std(num_tokens)然后创建一个嵌入向量(使用 kerasEmbedding类)

我在我的目标数据上使用 one-hot 编码,向量长度为​​ 10。

我的网络产生一个长度为 10 的softmax激活向量,我将categorical_crossentropy其用作损失函数。我为我的 GRU 单元选择了单元大小(这是正确的术语吗?),但是玩弄它们并没有为我带来更好的结果。

model = Sequential()
model.add(embedding)
model.add(GRU(units=32, return_sequences=True))
model.add(GRU(units=16))
model.add(Dense(10, activation='softmax'))
optimizer = SGD(lr=0.01)
model.compile(loss='categorical_crossentropy',
              optimizer=optimizer,
              metrics=['accuracy'])
model.summary()
model.fit(x_pad, y_encoded,
          validation_split=0.05, epochs=5, batch_size=64)

这是我从 keras 获得的网络摘要

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
layer_embedding (Embedding)  (None, 2290, 8)           8000
_________________________________________________________________
gru_1 (GRU)                  (None, 2290, 32)          3936
_________________________________________________________________
gru_2 (GRU)                  (None, 16)                2352
_________________________________________________________________
dense_1 (Dense)              (None, 10)                170
=================================================================
Total params: 14,458
Trainable params: 14,458
Non-trainable params: 0
_________________________________________________________________
Train on 259 samples, validate on 14 samples

我的准确率,在 0.01 的学习率下,总是收敛到 0.3166,但我不知道为什么

259/259 [==============================] - 18s 68ms/step - loss: 2.2998 - acc: 0.2124 - val_loss: 2.2935 - val_acc: 0.4286
Epoch 2/10
259/259 [==============================] - 16s 63ms/step - loss: 2.2927 - acc: 0.2973 - val_loss: 2.2854 - val_acc: 0.3571
Epoch 3/10
259/259 [==============================] - 16s 61ms/step - loss: 2.2822 - acc: 0.2471 - val_loss: 2.2767 - val_acc: 0.3571
Epoch 4/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2728 - acc: 0.2973 - val_loss: 2.2681 - val_acc: 0.4286
Epoch 5/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2651 - acc: 0.3166 - val_loss: 2.2575 - val_acc: 0.4286
Epoch 6/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2548 - acc: 0.3166 - val_loss: 2.2496 - val_acc: 0.4286
Epoch 7/10
259/259 [==============================] - 15s 57ms/step - loss: 2.2469 - acc: 0.3166 - val_loss: 2.2420 - val_acc: 0.4286
Epoch 8/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2382 - acc: 0.3166 - val_loss: 2.2325 - val_acc: 0.4286
Epoch 9/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2305 - acc: 0.3166 - val_loss: 2.2265 - val_acc: 0.4286
Epoch 10/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2222 - acc: 0.3166 - val_loss: 2.2158 - val_acc: 0.4286

我可以想到两个可能的原因,第一个是我的学习率太大(因为准确率似乎在跳跃,表明过冲)。我曾尝试将其一直降低到 0.05,但在 20 个 epoch 之后,我的准确度无法超过 0.2046。我也尝试过使用随机梯度下降和亚当优化器,但两者都没有产生截然不同的结果。

我能想到的另一个可能原因是我的数据集太小(只有 259 个样本),但我什至无法从过度拟合中获得高精度,所以我认为这不是问题?此外,我的实际特征数据(原始文本)非常庞大且广泛。

如果有任何帮助,我的完整源代码文件可在此处获得。

任何帮助将不胜感激,无论是正确方向的一点还是我在某处的理解的更正。谢谢

标签: pythonmachine-learningkerasdeep-learning

解决方案


我会争辩说你在虐待你的数据集。您有从 1 到 9 的评论,即使这不是一个连续的范围,它的特点是严格的总顺序你没有使用它。为了更清楚地说明我的观点,如果您的算法预测评论的得分为 8,而真正的标签为 9,那么它可能是错误的,但只是稍微有点错误。另一方面,如果它的预测为 1,那将是遥不可及的。您当前的系统无法区分这一点,因为您将所有 10 个离散类视为彼此距离相等。我的建议是将目标函数切换到 MSE,尽管您的数据具有离散性,并使用包装器来测量准确性。这肯定有助于训练,您可以稍后切换回交叉熵。

免责声明:我没有通读你的代码,但我经常遇到类似的问题,我已经能够按照我描述的方式解决它们。


推荐阅读