如何提高深度神经网络的准确性

数据挖掘 机器学习 神经网络 深度学习 张量流 准确性
2021-10-14 17:25:11

我正在使用 Tensorflow 来预测给定的句子是正面的还是负面的。我已经采集了 5000 个正句样本和 5000 个负句样本。我将 90% 的数据用于训练神经网络,其余 10% 用于测试。

下面是参数初始化。批量大小 = 100 时期 = 30 隐藏层数 = 每个隐藏层中的 3 个节点 = 100 时期 = 30

我可以看到每个时期的成本函数都在合理地减少。但是模型在测试集上的准确率很差(只有 56%)

 Epoch  1 completed out of  30 loss :  22611.10902404785
 Epoch  2 completed out of  30 loss :  12377.467597961426
 Epoch  3 completed out of  30 loss :  8659.753067016602
 Epoch  4 completed out of  30 loss :  6678.618850708008
 Epoch  5 completed out of  30 loss :  5391.995906829834
 Epoch  6 completed out of  30 loss :  4476.406986236572
 Epoch  7 completed out of  30 loss :  3776.497922897339
 -------------------------------------------------------
 Epoch  25 completed out of  30 loss :  478.93606185913086
 Epoch  26 completed out of  30 loss :  450.8017848730087
 Epoch  27 completed out of  30 loss :  435.0913710594177
 Epoch  28 completed out of  30 loss :  452.10553523898125
 Epoch  29 completed out of  30 loss :  539.5199084281921
 Epoch  30 completed out of  30 loss :  685.9198244810104
 Accuracy of Train : 0.88155556
 Accuracy of Test : 0.524

考虑到相同数量的数据集,是否可以调整任何参数以提高模型的准确性。

4个回答

你需要更多的数据。

当您拥有大量数据时,深度神经网络会大放异彩。

如果数据只有一点点,它很容易过拟合。训练和测试性能之间的巨大差异表明您的网络严重过度拟合。这也可能是因为与训练数据量相比,您的网络模型的容量(变量、节点)过多。较小的网络(较少的节点)可能会减少过度拟合。

为了提高你的准确性,在 tensorflow 中最简单的事情就是使用Dropout技术。尝试使用tf.nn.dropout. 在你的隐藏层之间。不要将它用于第一层和最后一层。要应用它,您可以查看如何在 Tensorflow 中应用 Drop Out 以提高神经网络的准确性

无论您使用何种正则化技术,如果您持续训练足够长的时间,您最终将过度拟合训练数据,您需要跟踪每个 epoch 的验证损失。当验证损失停止减少时,至少使用提前停止来停止训练过程。

这是过拟合的简单案例。

为了提高准确性,我建议进行以下更改:

由于您的“x”变量是句子,您可以尝试使用具有一个嵌入层和一个 LSTM 层的序列模型:

from tensorflow.keras.layers import Dense, Embedding, LSTM
from tensorflow.keras.models import Sequential

model = Sequential()

model.add(Embedding(max_features, 32))
model.add(LSTM(32)

将最后一层添加为 Dense Layer,将损失函数添加为 binary_crossentropy:

model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

拟合模型并存储历史变量以找到最佳时期:

history = model.fit(x_train, y_train, epochs=20, batch_size=128, validation_split=0.2)

绘制以下 2 条曲线:i) 验证损失与时期 ii) 验证准确度与时期

# Plotting Results
import matplotlib.pyplot as plt

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)

plt.plot(epochs, acc, 'b', label='Training acc')
plt.plot(epochs, val_acc, 'g', label='Validation acc')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')

plt.title('Training and validation accuracy')
plt.legend()
fig = plt.figure()
fig.savefig('acc.png')


plt.plot(epochs, loss, 'b', label='Training loss')
plt.plot(epochs, val_loss, 'g', label='Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Training and validation loss')

plt.legend()
plt.show()

之后你会得到一个类似这样的图表: 在此处输入图像描述

在此处输入图像描述

对于这种特定情况,我们看到最佳 epoch 出现在 12 处,因此我们需要再次训练 12 epoch 并测试测试数据。

model.fit(x_train, y_train, epochs=12, batch_size=128)
model.evaluate(x_test, y_test)