gpt4 book ai didi

python - 为什么我的模型准确率停留在 ~32%?

转载 作者:行者123 更新时间:2023-11-30 08:58:17 26 4
gpt4 key购买 nike

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

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

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

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

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

我的网络通过 softmax 激活生成长度为 10 的向量,并且我使用 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。我还尝试过使用随机梯度下降和 Adam 优化器,但两者都没有产生截然不同的结果。

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

如果有任何帮助,我的完整源代码文件可以使用 here .

任何帮助将不胜感激,无论是正确的方向还是纠正我的理解。谢谢

最佳答案

我认为你正在滥用你的数据集。您的评论评分范围为 1 到 9,尽管这不是一个连续的范围,但它的特点是您没有使用的严格总顺序。为了让我的观点更清楚,如果你的算法预测评论的得分为 8,而真实标签为 9,那么它可能是错误的,但也只是轻微的错误。另一方面,如果它的预测为 1,那么结果就会相差很大。您当前的系统无法进行这种区分,因为您将所有 10 个离散类别视为彼此相距同样遥远。我的建议是将目标函数切换为 MSE,尽管数据具有离散性质,并使用包装器来测量准确性。这绝对有助于训练,您可以稍后切换回交叉熵。

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

关于python - 为什么我的模型准确率停留在 ~32%?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50820527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com