Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我们何时以及为什么使用tf.reduce_的意思?_Python_Tensorflow - Fatal编程技术网

Python 我们何时以及为什么使用tf.reduce_的意思?

Python 我们何时以及为什么使用tf.reduce_的意思?,python,tensorflow,Python,Tensorflow,在设置模型时,我有时会看到以下代码: # Scenario 1 # Define loss and optimizer loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits( logits=logits, labels=Y)) 或 tf.reduce_mean的定义指出,它“沿着张量的各个维度计算张量元素的平均值”。我对它在更简单的语言中的作用感到困惑?我们什么时候需要使用它,可能是在场景1和场景2中?谢谢据我

在设置模型时,我有时会看到以下代码:

# Scenario 1
# Define loss and optimizer
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
    logits=logits, labels=Y))


tf.reduce_mean
的定义指出,它“沿着张量的各个维度计算张量元素的平均值”。我对它在更简单的语言中的作用感到困惑?我们什么时候需要使用它,可能是在场景1和场景2中?谢谢

据我所知,
tensorflow.reduce\u mean
numpy.mean
相同。它在基础的
tensorflow
图中创建一个运算,计算张量的平均值

tensorflow.reduce\u mean
最重要的关键字参数是
axis
。基本上,如果您有一个具有形状
(4,3,2)
轴=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}))
第一个输出是一个数字,因为我们没有提供轴。其余输出的形状分别为
(3,2)
(5,2)
(5,3)


当目标值为矩阵时,
reduce\u mean
可能很有用

User@meTchaikovsky解释了
tf.reduce\u mean
的一般情况。在这两种情况下,
tf.reduce_mean
只是作为任何平均值计算器工作,即,。你没有沿着张量的任何特定轴取平均值,你只需要将张量中元素的和除以元素的个数

让我们来解码这两种情况下到底发生了什么。对于这两种情况,都假设
batch_size=2
num_classes=5
,这意味着每个批次有两个示例。 现在对于第一种情况,
tf.nn.softmax\u cross\u entropy\u with\u logits(logits=logits,labels=Y)
返回一个形状数组
(2,)

>将numpy作为np导入
>>导入tensorflow作为tf
>>sess=tf.InteractiveSession()
>>批量大小=2
>>num_classes=5
>>logits=np.random.rand(批量大小,数量类)
>>打印(登录)
[[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]])
>>打印(标签)
[[1 0 0 0 0]
[0 1 0 0 0]]
>>logits=tf.placeholder(dtype=tf.float32,shape=(批大小,num\u类))
>>占位符(dtype=tf.int32,shape=(批大小,num类))
>>损耗op=tf.nn.softmax\u交叉熵\u与logits(logits=logits,labels=Y)
>>loss_per_example=sess.run(loss_op,feed_dict={Y_:labels,logits_:logits})
>>打印(每例丢失)
数组([1.2028817,1.6912657],dtype=float32)
您可以看到每个示例中的
损失
的形状
(2,)
。如果我们取这个变量的平均值,那么我们就可以近似计算整个批次的平均损失。因此我们计算

>每个示例的损失\u holder=tf.placeholder(dtype=tf.float32,shape=(批量大小))
>>每批最终损失=tf.减少平均值(每例持有人损失)
>>最终损失=sess.run(每批最终损失,进料记录={每例损失持有人:每例损失})
>>打印(最终损失)
1.4470737
关于你的第二个案例:

>预测\u holder=tf.placeholder(dtype=tf.float32,shape=(批大小,num\u类))
>>标签\u holder=tf.placeholder(dtype=tf.int32,shape=(批次大小,数量类))
>>预测值=tf.equal(tf.argmax(预测值=1),tf.argmax(标签=1))
>>labels\u match=sess.run(prediction\u tf,feed\u dict={predictions\u holder:logits,labels\u holder:labels})
>>打印(标签不匹配)
[真假]
上述输出是预期的,因为只有变量
logits
的第一个示例说明具有最高激活度(
0.9410
)的神经元为零,这与标签相同。现在我们要计算精度,这意味着我们必须取变量
labels\u match
的平均值

标签匹配持有者=tf.placeholder(数据类型=tf.float32,形状=(批量大小)) >>精度计算=tf.reduce平均值(tf.cast(标签匹配支架,tf.float32)) >>准确度=sess.run(准确度计算,进给量={labels\u match\u holder:labels\u match}) >>打印(准确性) 0.5
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}))