首页 文章

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

提问于
浏览
4

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

enter image description here

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

enter image description here

我无法弄清楚的疑虑是:

  • 它是否是整体损失函数值(到目前为止处理的每一步的综合损失)还是仅仅是该步骤的损失值?

  • 如果是那个步骤的损失值,那么如何获得整体损失函数的值并看到它的趋势,我觉得应该随着迭代次数的增加而减少?而据我所知,这是我们在训练数据集时应该注意的 Value .

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

2 回答

  • 0

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

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

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

    如果是那个步骤的损失值,那么如何获得整体损失函数的值并看到它的趋势,我觉得应该随着迭代次数的增加而减少?

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

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

    神经网络不学习的一个常见原因是超参数的选择很差(尽管你可以做到这一点) . 例如:

    • 学习率太大

    • 它's also possible that the learning rate is too small, which means that the neural network is learning, but very very slowly, so that you can' t看到它

    • 权重初始化可能太大,尝试减少它

    • 批量大小也可能太大

    • 您为输入传递了错误的标签

    • 训练数据包含缺失值或未标准化

    • ......

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

  • 2

    虽然以前的评论内容非常丰富,但并不能完全解决您的问题 . 当您实例化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**
    

相关问题