2017-02-21 85 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