2017-03-02 61 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