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

时间:2017-10-03 06:52:51

标签: python machine-learning tensorflow neural-network tensorboard

我使用Tensorflow DNNRegressor Estimator模型制作神经网络。但是调用estimator.train()函数给出的输出如下:

enter image description here

即。我的损失功能随着每一步都变化很大。但据我所知,我的损失函数应该减少而没有迭代。另外,找到Tensorboard Visualization for loss function的附加屏幕截图:

enter image description here

我无法弄清楚的疑问是:

  • 是否是整体损失函数值(到现在为止处理的每一步的综合损失)还是仅仅是该步骤的损失值?
  • 如果是那个步骤的损失值,那么如何获得整体损失函数的值并看到它的趋势,我觉得应该随着迭代次数的增加而减少?据我所知,这是我们在训练数据集时应该注意的价值。
  • 如果这是整体损失价值,那为什么它会如此波动?我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

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

  

是否是整体损失函数值(每个的综合损失   步骤处理到现在)或只是该步骤的损失值?

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

  

如果是该步骤的损失值,那么如何获得整体损失的价值   功能和看到它的趋势,我觉得应该减少   不增加迭代次数?

没有整体损失功能,可能你的意思是图表在每一步之后损失如何变化。这正是张量板向您展示的内容。你是对的,它的趋势并非如此。这表明你的神经网络没有学习。

  

如果这是整体损失价值,那为什么它会如此波动?我错过了什么吗?

神经网络不学习的一个常见原因是超参数的选择很差(尽管你可以做there are many more mistakes)。例如:

  • 学习率太大
  • 它也可能是学习率太小,这意味着神经网络正在学习,但非常慢,所以你无法看到它
  • 权重初始化可能太大,尝试减少它
  • 批量大小也可能太大
  • 您为输入传递了错误的标签
  • 训练数据包含缺失值或非标准化
  • ...

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

答案 1 :(得分:0)

虽然之前的评论信息量很大且很好,但它并没有完全解决您的问题。实例化DNNRegressor时,添加:     loss_reduction = tf.losses.Reduction.MEAN 在构造函数中,您将看到平均损失,收敛。

estimator = tf.estimator.DNNRegressor(      
    feature_columns=feat_clmns, 
    hidden_units=[32, 64, 32],
    weight_column=weight_clmn,
    **loss_reduction=tf.losses.Reduction.MEAN**