Tensorflow softmax评估

时间:2017-11-01 12:20:02

标签: python tensorflow

两个片段是否会在张量流中产生相同的结果?

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的输出是否会不同或相同?

1 个答案:

答案 0 :(得分:1)

[已更新] 新版本的代码在功能意义上是相同的:您将在每次迭代时获得相同的pred_val,因此,{{1} }。但是在第二个片段中有一个问题,这很重要。 preds的每次连续调用都会在图中创建一个新节点,即使它只使用一次。如果您打印图表定义,您会看到100 tf.contrib.layers.softmax个操作,而第一个代码段只有一个。{另一个有趣的副作用:此节点不会出现在tensorboard中。尽量避免在训练时创建操作,因为这是消耗所有RAM并使进程崩溃的可靠方法。换句话说,第一个片段更好。

[原始答案] 不,只是因为您在图表中定义了softmax节点并不意味着它将在会话中执行。您的第二个代码段仅评估logits_sf,这不依赖于softmax操作。

所以结果会有所不同:第一个会产生每个logits的概率分布,而第二个会产生原始的logits。