我正在尝试在某些模拟数据上训练自动编码器,其中输入基本上是使用高斯噪声的向量。该代码几乎与此示例完全相同:https://github.com/aymericdamien/tensorflow-examples/blob/master/master/examples/3_neuralnetworks/autoencoder.py.py
唯一的区别是我更改了网络参数和成本函数:
n_hidden_1 = 32 # 1st layer num features
n_hidden_2 = 16 # 2nd layer num features
n_input = 149 # LunaH-Map data input (number of counts per orbit)
cost = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_pred), reduction_indices=[1]))
在训练期间,误差稳步下降至0.00015,但预测和真实值大不相同,例如如此图像所示。实际上,预测的y向量几乎都是所有的。
如何通过非常错误的预测来减少错误?我的网络是否只是试图将重量移至log(1)以使跨熵成本最小化?如果是这样,我该如何战斗?
是的,网络只是学会了预测降低损失的1
。您正在使用的跨透镜损失是分类的,当y_true
是单速代码(示例:[0,0,1,0])时,最终层是softmax
(确保所有输出的总和为1)。因此,当y_true [idx]为0时,y__true [idx]为1时,损失不在乎,而y_pred [idx]为0,有无限(高)损失,但是如果其1损失,则损失又是损失。P>
现在,分类跨透明拷贝损失不适合自动编码器。对于真实有价值的输入,因此输出其于点误差,这是您引用的示例中使用的。但是最终激活层是sigmoid
,隐含地说x
的每个元素是0/1。因此,要么您需要转换数据以支持相同的数据,要么具有最后一层线性。
如果您确实想使用跨侧面损失,则可以使用二进制跨渗透对于具有0,1二进制跨渗透的输入:tf.reduce_mean(y_true * tf.log(y_pred) + (1-y_true) * tf.log(1-y_pred))
。如果您在两个错误预测的情况0-1、1-0中进行解决,网络将获得无限损失。再次注意,最后一层应为softmax
,x
的元素应在0和1