2017-02-23 80 views
1

我想其中输入基本应用了高斯噪声的向量训练的一些模拟数据自动编码。该代码是几乎完全一样在这个例子:https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/autoencoder.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,但预测值和真值非常不同,例如 as shown in this image。事实上,预测的y矢量几乎全是1。

如何通过非常错误的预测来减少误差?我的网络是否有可能试图将权重移近log(1),以尽量减少交叉熵成本?如果是这样,我该如何解决这个问题?

+1

您使用哪些数据进行评估?训练数据或未使用的验证数据? – yuval

+1

如果您所预测的结果是看不见的数据,那么您可能会遇到过度拟合的问题,即您的算法只是“记忆”了训练数据集,但没有足够好地归纳出新的,不可见的数据。 – kaufmanu

回答

0

是,网络简单地学会预测1从而降低了损失。你使用的交叉熵损失是当y_true是单热码(例如:[0,0,1,0])并且最后一层是softmax(确保所有输出的总和为1)时使用的分类。所以,当y_true [IDX]为0,损失也不当y_true [IDX]为1和y_pred [IDX]为0有无穷大(高)的损失,但照顾,同时如果1点,则损失又是0

现在分类交叉熵损失不适合自动编码器。对于实值的输入,因此输出它的均方误差,这就是你引用的例子中所用的。但是最后的激活层是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之间。

相关问题