两个片段是否会在张量流中产生相同的结果?
graph =tf.get_default_graph()
imgs = graph.get_tensor_by_name('Input:0')
logits = graph.get_tensor_by_name('Output/Conv:0')
for i in range(0,100):
pred_val = sess.run(tf.contrib.layers.softmax(logits), feed_dict={imgs: arr})
preds.append(pred_val)
pred = np.concatenate(preds)
将softmax插入以下不同的位置:
imgs = graph.get_tensor_by_name('Input:0')
logits = graph.get_tensor_by_name('Output/Conv:0')
logits_sf = tf.contrib.layers.softmax(logits)
for i in range(0,100):
pred_val = sess.run(logits_sf, feed_dict={imgs: arr})
preds.append(pred_val)
pred = np.concatenate(preds)
pred的输出是否会不同或相同?
答案 0 :(得分:1)
[已更新] 新版本的代码在功能意义上是相同的:您将在每次迭代时获得相同的pred_val
,因此,{{1} }。但是在第二个片段中有一个问题,这很重要。 preds
的每次连续调用都会在图中创建一个新节点,即使它只使用一次。如果您打印图表定义,您会看到100 tf.contrib.layers.softmax
个操作,而第一个代码段只有一个。{另一个有趣的副作用:此节点不会出现在tensorboard中。尽量避免在训练时创建操作,因为这是消耗所有RAM并使进程崩溃的可靠方法。换句话说,第一个片段更好。
[原始答案] 不,只是因为您在图表中定义了softmax
节点并不意味着它将在会话中执行。您的第二个代码段仅评估logits_sf
,这不依赖于softmax操作。
所以结果会有所不同:第一个会产生每个logits
的概率分布,而第二个会产生原始的logits。