了解深度自动编码器中损失和激活的选择?
Understanding choice of loss and activation in deep autoencoder?
我正在按照这个 keras 教程使用 MNIST 数据集创建自动编码器。这是教程:https://blog.keras.io/building-autoencoders-in-keras.html。
但是,我对简单的单层自动编码器(这是 link 中的第一个示例)的激活和损失的选择感到困惑。解码器部分使用 sigmoid
激活而不是 relu
之类的东西是否有特定原因?我试图了解这是否是我可以尝试的选择,或者它是否确实应该 sigmoid
,如果是,为什么?类似地,我知道损失是通过逐个像素级别比较每个原始数字和预测数字来计算的,但我不确定为什么损失是 binary_crossentropy
而不是均方误差之类的东西。
我很乐意对此进行澄清以帮助我前进!谢谢!
MNIST 图像通常在 [0, 1]
范围内归一化,因此自动编码器应输出相同范围内的图像,以便于学习。这就是在输出中使用 sigmoid
激活的原因。
均方误差损失具有非线性惩罚,大误差比较小误差具有更大的惩罚,这通常会导致收敛到解的均值,而不是更准确的解。二元交叉熵没有这个问题,因此是首选。它起作用是因为模型和标签的输出在 [0, 1]
范围内,并且损失应用于所有像素。
我正在按照这个 keras 教程使用 MNIST 数据集创建自动编码器。这是教程:https://blog.keras.io/building-autoencoders-in-keras.html。
但是,我对简单的单层自动编码器(这是 link 中的第一个示例)的激活和损失的选择感到困惑。解码器部分使用 sigmoid
激活而不是 relu
之类的东西是否有特定原因?我试图了解这是否是我可以尝试的选择,或者它是否确实应该 sigmoid
,如果是,为什么?类似地,我知道损失是通过逐个像素级别比较每个原始数字和预测数字来计算的,但我不确定为什么损失是 binary_crossentropy
而不是均方误差之类的东西。
我很乐意对此进行澄清以帮助我前进!谢谢!
MNIST 图像通常在 [0, 1]
范围内归一化,因此自动编码器应输出相同范围内的图像,以便于学习。这就是在输出中使用 sigmoid
激活的原因。
均方误差损失具有非线性惩罚,大误差比较小误差具有更大的惩罚,这通常会导致收敛到解的均值,而不是更准确的解。二元交叉熵没有这个问题,因此是首选。它起作用是因为模型和标签的输出在 [0, 1]
范围内,并且损失应用于所有像素。