tensorflow:pow给出负输出

时间:2017-03-02 13:47:20

标签: python tensorflow autoencoder

我使用tensorflow来构建一个简单的自动编码器模型,但是这个奇怪的错误我无法诊断 我有一个看起来像这样的损失函数:

def loss_func(x,y):
        return 0.5 * tf.reduce_mean(tf.pow(x-y, 2 ) ) 

然后通过以下方式计算总损失:

return self.loss_func(x , input) + self.reg_fac * reg

现在的问题是,当将reg_fac设置为0时,损失将返回为正数且模型似乎训练良好,但是当增加reg_fac时,损失会减少并达到负值并持续下降

对于每个使用的自动编码器,

reg计算如下:

return tf.reduce_mean(tf.pow(self.w1, 2)) + tf.reduce_mean(tf.pow(self.w2, 2))

其中w1是编码器权重,w2是解码器权重。 我知道这是一个愚蠢的错误,但我无法找到它。

我的完整代码在此处上传: https://github.com/javaWarrior/dltest

important files:
ae.py: autoencoders model,
sae.py: stacked autoencoders model,
mew.py: testing model on extracted features of nus_wide images using SIFT,
nus_wide.py: just an interface for nuswide

1 个答案:

答案 0 :(得分:1)

我不确定您的错误来自哪里,但我相信您的自动编码器模型通常存在一些问题。简单模型应该看起来像the tensorflow models repo中的示例。

    # model
    x = tf.placeholder(tf.float32, [None, len_input])
    h = tf.nn.softplus(tf.matmul(x, w1) + b1)
    xHat = tf.matmul(h, w2) + b

    # cost
    cost = 0.5 * tf.reduce_sum(tf.pow(xHat - x, 2.0))
    optimizer = tf.train.AdamOptimizer().minimize(cost)

因为它与问题有关,关键区别可能是使用reduce_sum()而不是reduce_mean()。我不确定你为什么要使用它。

此外,AdamOptimizer应该为您处理正则化。作为旁注,如果您想通过从头开始进行正规化来学习,我建议this tutorial