为什么 tf.nn.relu 和 tf.nn.sigmoid 在此自定义估算器中工作相同
Why do both tf.nn.relu and tf.nn.sigmoid work the same in this custom estimator
这是在 TensorFlow 中制作自定义估算器的指南:
https://www.tensorflow.org/guide/custom_estimators
隐藏层使用 tf.nn.relu
:
# Build the hidden layers, sized according to the 'hidden_units' param.
for units in params['hidden_units']:
net = tf.layers.dense(net, units=units, activation=tf.nn.relu)
我稍微修改了示例以学习 XOR,使用 hidden_units=[4]
和 n_classes=2
。当激活函数更改为 tf.nn.sigmoid
时,该示例照常运行。 为什么会这样?它是否仍然给出正确的结果,因为异或输入只是零和一?
这两个函数都给出平滑的损失曲线收敛到零线。
关于 XOR 问题,relu
解决了一个梯度消失的问题,即反向传播的误差值在深层隐藏层中消失。
因此,如果您只创建一个隐藏层,Sigmoid
就可以工作。
Sigmoid在0~1之间有一个vlue。
通过偏微分方程从输出层反向传播的误差值在远离输出层的地方将是非常小的值。
蓝线是 Relu,黄线是 Sigmoid。
如果大于 0,则 Relu 具有 x 值。
所以,错误值可以到达第一层。
这是在 TensorFlow 中制作自定义估算器的指南: https://www.tensorflow.org/guide/custom_estimators
隐藏层使用 tf.nn.relu
:
# Build the hidden layers, sized according to the 'hidden_units' param.
for units in params['hidden_units']:
net = tf.layers.dense(net, units=units, activation=tf.nn.relu)
我稍微修改了示例以学习 XOR,使用 hidden_units=[4]
和 n_classes=2
。当激活函数更改为 tf.nn.sigmoid
时,该示例照常运行。 为什么会这样?它是否仍然给出正确的结果,因为异或输入只是零和一?
这两个函数都给出平滑的损失曲线收敛到零线。
关于 XOR 问题,relu
解决了一个梯度消失的问题,即反向传播的误差值在深层隐藏层中消失。
因此,如果您只创建一个隐藏层,Sigmoid
就可以工作。
Sigmoid在0~1之间有一个vlue。 通过偏微分方程从输出层反向传播的误差值在远离输出层的地方将是非常小的值。
蓝线是 Relu,黄线是 Sigmoid。
如果大于 0,则 Relu 具有 x 值。 所以,错误值可以到达第一层。