如何解释 Tensorflow DNNRegressor Estimator 模型中的损失函数?
How to interpret loss function in Tensorflow DNNRegressor Estimator model?
我正在使用 Tensorflow DNNRegressor Estimator 模型制作神经网络。但是调用 estimator.train()
函数给出的输出如下:
即我的损失函数在每一步都变化很大。但据我所知,我的损失函数应该随着迭代次数的减少而减少。另外,找到附加的损失函数的 Tensorboard 可视化屏幕截图:
我想不通的疑惑是:
- 是整体损失函数值(到目前为止处理的每个步骤的综合损失)还是该步骤的损失值?
- 如果是那一步的损失值,那么如何获取整体损失函数的值并查看其趋势,我觉得应该随着迭代次数的增加而减少?据我所知,这是我们在训练数据集时应该考虑的价值。
- 如果这是整体损失值,那为什么波动这么大?我错过了什么吗?
首先,让我指出tf.contrib.learn.DNNRegressor
使用线性回归头与mean_squared_loss
,即简单的L2损失。
Whether it is overall loss function value (combined loss for every
step processed till now) or just that step's loss value?
图表上的每个点都是到目前为止学习后最后一步的损失函数值。
If it is that step's loss value, then how to get value of overall loss
function and see its trend, which I feel should decrease with
increasing no of iterations?
没有整体损失函数,可能你的意思是每一步后损失如何变化的图表。这正是 tensorboard 向您展示的内容。你是对的,它的趋势并没有像它应该的那样向下。这表明您的神经网络没有在学习。
If this is overall loss value, then why is it fluctuating so much? Am I missing something?
神经网络无法学习的一个常见原因是超参数选择不当(尽管 there are many more mistakes 您可能会选择)。例如:
- 学习率太大
- 也有可能是学习率太小了,就是说神经网络在学习,但是非常非常慢,以至于你看不出来
- 权重初始化可能太大,尝试减小它
- 批量大小也可能太大
- 您为输入传递了错误的标签
- 训练数据包含缺失值,或未规范化
- ...
我通常做的是检查神经网络是否至少以某种方式工作,将训练集减少到几个例子并尝试过度拟合网络。这个实验非常快,所以我可以尝试各种学习率、初始化方差和其他参数来找到最佳点。一旦我有了一个稳定下降的损失图表,我就会继续使用更大的一组。
尽管之前的评论内容丰富且内容丰富,但并没有完全解决您的问题。实例化 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**
我正在使用 Tensorflow DNNRegressor Estimator 模型制作神经网络。但是调用 estimator.train()
函数给出的输出如下:
即我的损失函数在每一步都变化很大。但据我所知,我的损失函数应该随着迭代次数的减少而减少。另外,找到附加的损失函数的 Tensorboard 可视化屏幕截图:
我想不通的疑惑是:
- 是整体损失函数值(到目前为止处理的每个步骤的综合损失)还是该步骤的损失值?
- 如果是那一步的损失值,那么如何获取整体损失函数的值并查看其趋势,我觉得应该随着迭代次数的增加而减少?据我所知,这是我们在训练数据集时应该考虑的价值。
- 如果这是整体损失值,那为什么波动这么大?我错过了什么吗?
首先,让我指出tf.contrib.learn.DNNRegressor
使用线性回归头与mean_squared_loss
,即简单的L2损失。
Whether it is overall loss function value (combined loss for every step processed till now) or just that step's loss value?
图表上的每个点都是到目前为止学习后最后一步的损失函数值。
If it is that step's loss value, then how to get value of overall loss function and see its trend, which I feel should decrease with increasing no of iterations?
没有整体损失函数,可能你的意思是每一步后损失如何变化的图表。这正是 tensorboard 向您展示的内容。你是对的,它的趋势并没有像它应该的那样向下。这表明您的神经网络没有在学习。
If this is overall loss value, then why is it fluctuating so much? Am I missing something?
神经网络无法学习的一个常见原因是超参数选择不当(尽管 there are many more mistakes 您可能会选择)。例如:
- 学习率太大
- 也有可能是学习率太小了,就是说神经网络在学习,但是非常非常慢,以至于你看不出来
- 权重初始化可能太大,尝试减小它
- 批量大小也可能太大
- 您为输入传递了错误的标签
- 训练数据包含缺失值,或未规范化
- ...
我通常做的是检查神经网络是否至少以某种方式工作,将训练集减少到几个例子并尝试过度拟合网络。这个实验非常快,所以我可以尝试各种学习率、初始化方差和其他参数来找到最佳点。一旦我有了一个稳定下降的损失图表,我就会继续使用更大的一组。
尽管之前的评论内容丰富且内容丰富,但并没有完全解决您的问题。实例化 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**