我使用Tensorflow DNNRegressor Estimator模型制作神经网络 . 但是调用 estimator.train()
函数给出的输出如下:
即我的损失功能随着每一步都变化很大 . 但据我所知,我的损失函数应该减少而没有迭代 . 另外,找到Tensorboard Visualization for loss function的附加屏幕截图:
我无法弄清楚的疑虑是:
-
它是否是整体损失函数值(到目前为止处理的每一步的综合损失)还是仅仅是该步骤的损失值?
-
如果是那个步骤的损失值,那么如何获得整体损失函数的值并看到它的趋势,我觉得应该随着迭代次数的增加而减少?而据我所知,这是我们在训练数据集时应该注意的 Value .
-
如果这是整体损失 Value ,那为什么它会如此波动?我错过了什么吗?
2 回答
首先,我要指出tf.contrib.learn.DNNRegressor使用带有
mean_squared_loss
的线性回归头,即简单的L2损失 .图表上的每个点都是到目前为止学习后最后一步的损失函数的值 .
没有整体损失函数,可能你的意思是图表在每一步之后损失如何变化 . 这正是张量板向您展示的内容 . 你是对的,它的趋势并非如此 . 这表明您的神经网络没有学习 .
神经网络不学习的一个常见原因是超参数的选择很差(尽管你可以做到这一点) . 例如:
学习率太大
它'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看到它
权重初始化可能太大,尝试减少它
批量大小也可能太大
您为输入传递了错误的标签
训练数据包含缺失值或未标准化
......
我通常做的是检查神经网络是否至少在某种程度上起作用,将训练集减少到几个例子并尝试过度拟合网络 . 这个实验非常快,所以我可以尝试各种学习率,初始化方差和其他参数来找到最佳点 . 一旦我有一个稳定下降的损失图表,我继续一个更大的集合 .
虽然以前的评论内容非常丰富,但并不能完全解决您的问题 . 当您实例化DNNRegressor时,在构造函数中添加:loss_reduction = tf.losses.Reduction.MEAN,您将看到平均损失,收敛 .