使用 BP 神经网络进行深度学习时在训练时获得平坦的误差曲线

Posted

技术标签:

【中文标题】使用 BP 神经网络进行深度学习时在训练时获得平坦的误差曲线【英文标题】:Getting flat error curves while training when deep learning with BP neural nets 【发布时间】:2019-07-20 18:44:22 【问题描述】:

在使用传统的 BP 神经网络进行深度学习时,我总是得到平坦的错误图曲线。我正在使用带有 Adam 优化器的 Keras 顺序模型。 NN 为训练和测试提供了 80% 的总体准确率。谁能解释为什么误差曲线是平坦的(见附图)?还有什么方法可以提高我的成绩吗?

def build_model():
  model = keras.Sequential()
  model.add(layers.Dense(128, activation=tf.nn.relu, input_shape=len(normed_train_data.keys())]))
  model.add(layers.Dense(128,activation=tf.nn.relu, input_shape=(1,)))
  model.add(layers.Dense(4))
  model.compile(loss='mean_squared_error', optimizer='Adam',metrics=['mae', 'mse','accuracy'])
  return model

def plot_history(history):
   hist = pd.DataFrame(history.history)
   hist['epoch'] = history.epoch
   plt.figure()
   plt.xlabel('Epoch')
   plt.ylabel('Mean Abs Error [per]')
   plt.plot(hist['epoch'], hist['mean_absolute_error'],label='Train Error')
   plt.plot(hist['epoch'], hist['val_mean_absolute_error'],label = 'Val Error')
   plt.legend()
   plt.ylim([0,200])
   plt.show()

而在主函数中,

model = build_model()
model.summary()
history = model.fit(normed_train_data, train_labels,epochs=EPOCHS,validation_split = 0.2, verbose=0,callbacks=[PrintDot()])
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
plot_history(history)

错误图:

Error plot with reduced learning rate

【问题讨论】:

【参考方案1】:

如果没有关于您的数据的更多信息,很难评估是否可以共享样本?但我冒险猜测您的模型很快就会过拟合。您可以尝试的事情:

模型简化 - 尝试移除一层,或者使用更少的单元来开始 不同的优化器,尝试不同学习率的 sgd 不同的指标(尝试一一删除)

【讨论】:

样本输入向量:[9349 8699 8836 13316 12771 0.2022 -0.2097 -0.0209]---特征,样本输出向量:[5.56 13.89 0.00 80.56]---这些是概率值。我正在使用 4,52,995 个样本进行训练。 我在输入网络之前对输入特征进行规范化 我已经尝试过不同数量的层和优化器,但得到的结果几乎相同。 如果它过度拟合,我如何获得相同的测试数据精度(有时更多)?我正在使用 113249 个样本进行测试。 我也不认为,更改指标会改善结果,因为它被记录为:“指标函数类似于损失函数,除了评估指标的结果是训练模型时不使用。”

以上是关于使用 BP 神经网络进行深度学习时在训练时获得平坦的误差曲线的主要内容,如果未能解决你的问题,请参考以下文章

深度学习基础--神经网络--BP反向传播算法

八.DBN深度置信网络

深度学习名词解释

lstm-bp过程的手工源码实现

学习笔记:深度学习——BP神经网络

MATLAB中训练LM算法的BP神经网络