为什么我的模型精度会降低~32%?

时间:2018-06-12 15:14:01

标签: python machine-learning keras deep-learning

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

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

我创建了一个由Anthony Fantano制作的专辑评论数据集,其分数目标分别为1-9(here)。我的目标是使用情绪分析来根据输入文本预测分数。

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

我在目标数据上使用单热编码,长度为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个时代之后我的准确度无法通过0.2046。我也尝试过使用Stochastic Gradient Descent和Adam优化器,但两者都没有产生截然不同的结果。

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

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

任何帮助都会非常感激,无论是朝着正确的方向发展还是纠正我的理解。感谢

2 个答案:

答案 0 :(得分:1)

我认为你是在误解你的数据集。您的评分范围为1到9,即使这不是一个连续的范围,它的特点是您没有使用的严格的总订单。为了使我的观点更清楚,如果你的算法预测评论被分配了8分,真实标签是9,那么它可能是错误的,但它只是略微如此。另一方面,如果它预测为1,那么它就会偏离。您当前的系统无法进行区分,因为您将所有10个离散类视为彼此相同的远程类。我的建议是将目标函数切换到MSE,尽管数据具有离散性,并使用包装器来测量精度。这绝对有助于培训,您可以稍后切换回Cross-Entropy。

免责声明:我还没有阅读您的代码,但我经常遇到类似的问题,而且我已经能够按照我描述的方式解决这些问题。

答案 1 :(得分:1)

Konstantinos是绝对正确的 - 因为结果是一个测量某事物量的编号结果(在这种情况下是评论),你想要使用MSE,并确保模型将数字视为“比例”而不是个别的类。如果你本身确定音乐类型(流行音乐,嘻哈音乐,摇滚音乐等),你会使用个别课程,但在这种情况下,有一定程度的“善”(9是非常好的,1是不好)。通常,任何类型的评级问题都需要使用这个“MSE规模”系统。

使用它的一个主要示例是我的书中关于DL和股票预测的模型/算法,您可以阅读更多关于here的内容。它使用深度学习模型对股票进行评级(也称为“买入评级”)。

祝你好运!

相关问题