如何在Tensorflow DNNRegressor Estimator模型中解释损失函数?

我正在使用Tensorflow的DNNRegressor Estimator模型来构建神经网络。但是调用estimator.train()函数时,输出如下:

enter image description here

也就是说,我的损失函数在每一步都有很大的波动。但据我所知,我的损失函数应该随着迭代次数的增加而减少。另外,请查看附件中的Tensorboard可视化损失函数的截图:

enter image description here

我无法解决的疑惑包括:

  • 这是总体损失函数值(到目前为止处理过的每一步的综合损失)还是仅是该步骤的损失值?
  • 如果这是该步骤的损失值,那么如何获取总体损失函数的值并查看其趋势?我认为该趋势应随着迭代次数的增加而下降。我认为这是我们在训练数据集时应该关注的值。
  • 如果这是总体损失值,那么为什么它波动如此大?我是否遗漏了什么?

回答:

首先,让我指出tf.contrib.learn.DNNRegressor使用带有mean_squared_loss的线性回归头,即简单的L2损失。

这是总体损失函数值(到目前为止处理过的每一步的综合损失)还是仅是该步骤的损失值?

图表上的每个点都是到目前为止学习后的最后一步的损失函数值。

如果这是该步骤的损失值,那么如何获取总体损失函数的值并查看其趋势?我认为该趋势应随着迭代次数的增加而下降。

没有总体损失函数,你可能指的是显示每一步后损失如何变化的图表。这正是tensorboard向你展示的内容。你是对的,其趋势并不是向下的,正如它应该的那样。这表明你的神经网络没有在学习。

如果这是总体损失值,那么为什么它波动如此大?我是否遗漏了什么?

神经网络未能学习的一个常见原因是超参数选择不当(尽管还有许多其他可能的错误)。例如:

  • 学习率太大
  • 学习率也可能太小,这意味着神经网络在学习,但速度非常非常慢,以至于你看不到
  • 权重初始化可能太大,尝试减小它
  • 批量大小也可能太大
  • 你传递给输入的标签错误
  • 训练数据包含缺失值或未标准化

我通常用来检查神经网络是否至少在某种程度上工作的方法是将训练集减少到几个例子,并尝试让网络过拟合。这个实验非常快,所以我可以尝试各种学习率、初始化方差和其他参数来找到一个最佳点。一旦我有了一个稳定的下降损失图表,我就会继续使用更大的数据集。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注