在设置模型时,我有时会看到代码:
# Scenario 1
# Define loss and optimizer
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
logits=logits, labels=Y))
或
# Scenario 2
# Evaluate model (with test logits, for dropout to be disabled)
prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(prediction, tf.float32))
tf.reduce_mean
的定义表明,它“计算沿张量的各个维度的张量元素的平均值”。我对它用简单的语言做什么感到困惑?我们何时需要使用它,也许参考#方案1和2?谢谢
答案 0 :(得分:2)
据我了解,tensorflow.reduce_mean
与numpy.mean
相同。它在基础tensorflow
图中创建一个运算,计算张量的平均值。
tensorflow.reduce_mean
最重要的关键字参数是axis
。基本上,如果您有一个形状为(4, 3, 2)
和axis=1
的张量,则会创建一个形状为(4, 2)
的空数组,并且将计算沿选定轴的平均值以填充空数组。 (这只是一个伪过程,可以帮助您理解输出,但可能不是实际过程)
这是一个简单的示例,可帮助您了解
import tensorflow as tf
import numpy as np
one = np.linspace(1, 30, 30).reshape(5, 3, 2)
x = tf.placeholder('float32', shape=[5, 3, 2])
op_1 = tf.reduce_mean(x)
op_2 = tf.reduce_mean(x, axis=0)
op_3 = tf.reduce_mean(x, axis=1)
op_4 = tf.reduce_mean(x, axis=2)
with tf.Session() as sess:
print(sess.run(op_1, feed_dict={x: one}))
print(sess.run(op_2, feed_dict={x: one}))
print(sess.run(op_3, feed_dict={x: one}))
print(sess.run(op_4, feed_dict={x: one}))
第一个输出是数字,因为我们没有提供axis
。其余输出的形状分别为(3, 2)
,(5, 2)
和(5, 3)
。
reduce_mean
可能很有用。
答案 1 :(得分:0)
用户@meTchaikovsky解释了tf.reduce_mean
的一般情况。在您的两种情况下,tf.reduce_mean
都可以用作任何均值计算器,即。您无需沿张量的任何特定轴取均值,只需将张量中的元素之和除以元素数即可。
让我们解码一下两种情况下到底发生了什么。对于这两种情况,均假设batch_size = 2
和num_classes = 5
,这意味着每批有两个示例。
现在,对于第一种情况,tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y)
返回形状为(2,)
的数组。
>>import numpy as np
>>import tensorflow as tf
>>sess= tf.InteractiveSession()
>>batch_size = 2
>>num_classes = 5
>>logits = np.random.rand(batch_size,num_classes)
>>print(logits)
[[0.94108451 0.68186329 0.04000461 0.25996487 0.50391948]
[0.22781201 0.32305269 0.93359371 0.22599208 0.05942905]]
>>labels = np.array([[1,0,0,0,0],[0,1,0,0,0]])
>>print(labels)
[[1 0 0 0 0]
[0 1 0 0 0]]
>>logits_ = tf.placeholder(dtype=tf.float32,shape=(batch_size,num_classes))
>>Y_ = tf.placeholder(dtype=tf.int32,shape=(batch_size,num_classes))
>>loss_op = tf.nn.softmax_cross_entropy_with_logits(logits=logits_, labels=Y_)
>>loss_per_example = sess.run(loss_op,feed_dict={Y_:labels,logits_:logits})
>>print(loss_per_example)
array([1.2028817, 1.6912657], dtype=float32)
您会看到loss_per_example
的形状为(2,)
。如果我们取这个变量的平均值,那么我们可以估算出整个批次的平均损失。因此,我们计算
>>loss_per_example_holder = tf.placeholder(dtype=tf.float32,shape=(batch_size))
>>final_loss_per_batch = tf.reduce_mean(loss_per_example_holder)
>>final_loss = sess.run(final_loss_per_batch,feed_dict={loss_per_example_holder:loss_per_example})
>>print(final_loss)
1.4470737
第二种情况:
>>predictions_holder = tf.placeholder(dtype=tf.float32,shape=(batch_size,num_classes))
>>labels_holder = tf.placeholder(dtype=tf.int32,shape=(batch_size,num_classes))
>>prediction_tf = tf.equal(tf.argmax(predictions_holder, 1), tf.argmax(labels_holder, 1))
>>labels_match = sess.run(prediction_tf,feed_dict={predictions_holder:logits,labels_holder:labels})
>>print(labels_match)
[ True False]
上面的输出是预期的,因为仅变量logits
的第一个示例说,具有最高激活(0.9410
)的神经元为零,与标签相同。现在我们要计算精度,这意味着我们必须取变量labels_match
的平均值。
>>labels_match_holder = tf.placeholder(dtype=tf.float32,shape=(batch_size))
>>accuracy_calc = tf.reduce_mean(tf.cast(labels_match_holder, tf.float32))
>>accuracy = sess.run(accuracy_calc, feed_dict={labels_match_holder:labels_match})
>>print(accuracy)
0.5