2017-02-21 10 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]]})

вы сохраняете результат выполнения output цит в переменной result питона.

Во втором:

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]]})

вы сохраняете результат prob оп в переменной result питона.

Поскольку оба ОП различны, следует ожидать, что возвращаемые ими значения будут разными.

Вы можете запустить

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