Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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 为什么我们需要“我们需要什么?”;分配;在TensorFlow中?_Python_Tensorflow - Fatal编程技术网

Python 为什么我们需要“我们需要什么?”;分配;在TensorFlow中?

Python 为什么我们需要“我们需要什么?”;分配;在TensorFlow中?,python,tensorflow,Python,Tensorflow,我正在看一个例子。我看到了以下操作顺序: 将tensorflow导入为tf v1=tf.get_变量(“v1”,shape=[3],初始值设定项=tf.zeros_初始值设定项) inc_v1=v1.分配(v1+1) init_op=tf.global_variables_initializer() s=tf.Session() s、 运行(初始操作) s、 运行(inc_v1) 因此,我们得到: 数组([1,1,1.],dtype=float32) 我不理解“分配”操作背后的逻辑。特别是,

我正在看一个例子。我看到了以下操作顺序:

将tensorflow导入为tf
v1=tf.get_变量(“v1”,shape=[3],初始值设定项=tf.zeros_初始值设定项)
inc_v1=v1.分配(v1+1)
init_op=tf.global_variables_initializer()
s=tf.Session()
s、 运行(初始操作)
s、 运行(inc_v1)
因此,我们得到:

数组([1,1,1.],dtype=float32)
我不理解“分配”操作背后的逻辑。特别是,我用一些看起来简单得多的东西取代了它:

将tensorflow导入为tf
v1=tf.get_变量(“v1”,shape=[3],初始值设定项=tf.zeros_初始值设定项)
inc_v1=v1+1
init_op=tf.global_variables_initializer()
s=tf.Session()
s、 运行(初始操作)
s、 运行(inc_v1)

我得到了完全相同的结果。那么,我们为什么需要赋值呢?

当您想要赋值一个不是来自图形的值时,您需要赋值

它接受您的原始张量和一个新张量,用一个新值更新您的张量的原始值,并返回您的原始张量的引用。请看在Tensorboard上生成的图形:

操作
assign
返回对原始张量的引用:

如果没有
assign
,只需创建另一个张量来添加常量值:


如果您打印张量
v1
(在运行
inc_v1
后)的计算结果,它将输出
[1.1.1.]
,作为操作的结果,并将其重新分配给原始张量。在第二种情况下,它将保持为
[0.0.0.]

该示例确实不是很好的说明性。重要的一点是
assign
将给定的值保存到会话中的变量中,以便稍后在调用
run
时使用它。请看这里:

import tensorflow as tf

v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
inc_v1 = v1.assign(v1+1)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    sess.run(inc_v1)
    print(sess.run(v1))
    # [1. 1. 1.]
    sess.run(inc_v1)
    print(sess.run(v1))
    # [2. 2. 2.]
注意
v1
保存分配的值,因此在进一步调用
run
时可以使用它。现在比较:

import tensorflow as tf

v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
inc_v1 = v1+1
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    sess.run(inc_v1)
    print(sess.run(v1))
    # [0. 0. 0.]
    sess.run(inc_v1)
    print(sess.run(v1))
    # [0. 0. 0.]
在这里,增量发生在对
run
的一次调用中,但其结果从未保存在任何位置,并且
v1
保持值
[0.0.0.]


变量很重要,因为TensorFlow中的大多数事情都是在几个步骤上完成的,例如,神经网络中的每个批次。每一步都是对
运行的调用
,重要的是要将一步中对模型的更改(例如,神经网络中权重的更新)保存到下一步,否则您将原地运行,永远不会离开起点

你说的“来自图表”是什么意思?要设置“inc_v1”的值,我们使用“v1”。在这种情况下,我们能说这个值来自一个图表吗?@Roman是的。不来自图形的示例包括来自不同图形、文件、用户输入等的内容。我更新了答案,并在最后做了一些解释;)