2017-03-02 35 views
0

我使用tensorflow建立一个简单的自动编码模型负输出,但是有这个奇怪的错误,我不能诊断 我有一个看起来像这样的损失函数: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_fac0损失收益为正数和车型似乎练好,但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

我不知道您的错误是来自,但我相信,有一些问题,在一般的自编码模式。简单模型应该看起来像从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

+0

我使用adamoptimizer与成本正则化术语。但我不认为reduce_sum会有所作为,因为它只是规模上的差异? – mohRamadan

+0

然后我道歉。如果我使用Adagrad或其他扩展名,我通常会允许算法处理正则化。区别仅仅在于规模,但它是正确的frobenius规范。我假设你的模型有问题(这就是为什么我只包含一个例子)。你能用全模型更新这个问题吗? –

+0

这是一种意大利面条代码,因为我只是在测试自动编码器,但无论如何我都会上传它 – mohRamadan