2017-02-21 82 views
0

我在TensorFlow中有一個奇怪的錯誤。考慮下面的代碼,一個簡單的前饋神經網絡的一部分:TensorFlow以什麼順序評估計算圖中的節點?

output = (tf.matmul(layer_3,w_out) + b_out) 
prob = tf.nn.sigmoid(output); 
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = output, targets = y_, name=None)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(loss, var_list = model_variables)` 

(請注意,概率不用於定義損失函數。這是因爲sigmoid_cross_entropy在其定義的內部應用乙狀結腸) 後來我跑優化器在以下行:

result,step_loss,_ = sess.run(fetches = [output,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]}); 

上述工作就好了。但是,如果我運行以下代碼行來運行代碼,則網絡似乎表現非常糟糕,儘管應該沒有任何區別!

result,step_loss,_ = sess.run(fetches = [prob,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]}); 

我有一種感覺,它與TF在會話過程中計算節點的順序有關,但我不確定。這個問題會是什麼?

回答

0

這不是圖表的問題,只是你在看不同的東西。

在第一個例子你提供:

result,step_loss,_ = sess.run(fetches = [output,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]})

要保存運行在result蟒變量output運算的結果。

在第二個:

result,step_loss,_ = sess.run(fetches = [prob,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]})

要保存在result蟒蛇變量prob運算的結果。

由於兩個操作符都不相同,因此可以預期它們返回的值將會不同。

您可以運行

logits, activation, step_loss, _ = sess.run(fetches = [output, prob, loss, optimizer], ...)

檢查結果。

+0

問題是,當我針對測試集運行時,根本不使用概率。事實上,我使用以下來測試:'result = sess.run(fetches = output,feed_dict = {x_:[[X_,Y_,X_ * X_,Y_ * Y_,X_ * Y _]]);'I當我測試時,不要在任何地方使用概率。然而,在培訓期間取代輸出與概率導致測試階段表現不佳。 – user308485