Python 如何为TensorFlow变量赋值?

Python 如何为TensorFlow变量赋值?,python,tensorflow,neural-network,deep-learning,variable-assignment,Python,Tensorflow,Neural Network,Deep Learning,Variable Assignment,我试图在python中为tensorflow变量分配一个新值 import tensorflow as tf import numpy as np x = tf.Variable(0) init = tf.initialize_all_variables() sess = tf.InteractiveSession() sess.run(init) print(x.eval()) x.assign(1) print(x.eval()) 但我得到的结果是 0 0 因此,该值没有改变。我缺

我试图在python中为tensorflow变量分配一个新值

import tensorflow as tf
import numpy as np

x = tf.Variable(0)
init = tf.initialize_all_variables()
sess = tf.InteractiveSession()
sess.run(init)

print(x.eval())

x.assign(1)
print(x.eval())
但我得到的结果是

0
0
因此,该值没有改变。我缺少什么?

在TF1中,该语句实际上并没有将值
1
赋给
x
,而是创建了一个必须显式运行才能更新变量的值。*调用或可用于运行该操作:

assign_op = x.assign(1)
sess.run(assign_op)  # or `assign_op.op.run()`
print(x.eval())
# ==> 1
(*事实上,它返回一个
tf.Tensor
,对应于变量的更新值,以便于链接赋值。)

但是,在TF2中,现在将急切地分配值:

x.assign(1)
print(x.numpy())
# ==> 1

有一种更简单的方法:

x = tf.Variable(0)
x = x + 1
print x.eval()

首先,您可以将值赋给变量/常量,方法与使用占位符时相同。因此,这样做完全合法:

import tensorflow as tf
x = tf.Variable(0)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(x, feed_dict={x: 3})
关于你和接线员的混淆。在TF中,在会话内部运行之前不会执行任何操作。因此,您必须始终执行以下操作:
op\u name=tf。一些函数创建op(params)
,然后在您运行的会话内部运行
sess.run(op\u name)
。以“分配”为例,您将执行以下操作:

import tensorflow as tf
x = tf.Variable(0)
y = tf.assign(x, 1)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(x)
    print sess.run(y)
    print sess.run(x)

另外,必须注意的是,如果您使用的是
张量.assign()
,则无需显式调用
tf.global\u variables\u初始值设定项,因为assign操作是在后台为您执行的

例如:

In [212]: w = tf.Variable(12)
In [213]: w_new = w.assign(34)

In [214]: with tf.Session() as sess:
     ...:     sess.run(w_new)
     ...:     print(w_new.eval())

# output
34 

但是,这不会初始化所有变量,但只会初始化对其执行
assign
的变量。

您也可以为
tf.variable
分配新值,而无需向图形添加操作:。当从图形外部指定值时,此函数还可以节省添加占位符的时间,并且在图形最终确定时非常有用

将tensorflow导入为tf
x=tf.变量(0)
sess=tf.Session()
sess.run(tf.global\u variables\u initializer())
打印(sess.run(x))#打印0。
x、 负载(1,sess)
打印(sess.run(x))#打印1。

更新:TF2中对此进行了详细说明,因为急切执行是默认值,图形是。

以下是完整的工作示例:

import numpy as np
import tensorflow as tf

w= tf.Variable(0, dtype=tf.float32) #good practice to set the type of the variable
cost = 10 + 5*w + w*w
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)

print(session.run(w))

session.run(train)
print(session.run(w)) # runs one step of gradient descent

for i in range(10000):
  session.run(train)

print(session.run(w))
注:输出为:

0.0
-0.049999997
-2.499994
这意味着在一开始,变量为0,如定义,然后在梯度下降一步后,变量为-0.0499997,再经过10.000步后,我们将达到-2.499994(基于我们的成本函数)


注意:您最初使用的是交互式会话。当需要在同一脚本中运行多个不同会话时,交互式会话非常有用。但是,为了简单起见,我使用了非交互式会话。

使用最新的Tensorflow急切执行模式

import tensorflow as tf
tf.enable_eager_execution()
my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3])
print(my_int_variable)

所以我有一个不同的例子,在运行会话之前我需要分配值,所以这是最简单的方法:

other_variable = tf.get_variable("other_variable", dtype=tf.int32,
  initializer=tf.constant([23, 42]))

在这里,我创建一个变量,同时给它赋值

我回答了一个类似的问题。我看了很多总是产生同样问题的地方。基本上,我不想给权重赋值,只是简单地更改权重。上述答案的简短版本为:


tf.keras.backend.set\u值(tf\u变量,numpy\u权重)

谢谢!assign_op.run()给出错误:AttributeError:“Tensor”对象没有属性“run”。但是sess.run(assign_op)运行得非常好。在本例中,
变量
x
assign
操作/可变张量运行之前存储在内存中的数据是被覆盖的还是创建了一个存储更新值的新张量?
assign()的当前实现
覆盖现有值。是否有方法在不在图形中创建任何附加操作的情况下将新值分配给
变量
?似乎每个变量都已经为其创建了一个赋值操作,但是调用
my_var.Assign()
tf.Assign()
会创建一个新的操作,而不是使用现有的操作。我不认为这与此相关,但您可以给
Assign
一个张量参数,例如数学运算。用这种方法创建一个计数器,每次赋值操作求值时都会更新:
op=t.assign(tf.add(t,1))
。o.p.正在检查
tf.assign的用法,而不是加法。注意:不能使用与变量初始值形状不同的数组加载它!Variable.load(来自tensorflow.python.ops.variables)已被弃用,并将在将来的版本中删除。更新说明:首选在2.X中具有等效行为的Variable.assign。不知道如何更改Tensorflow 2.0中变量的值而不向graph@RobinDinse是的。在上面的示例中,您得到0,1,1作为标准输出。请注意,通过
feed\u dict
输入值并不会将该值永久分配给变量,而只针对特定的运行调用。@robindense如何永久分配该值?如果可以,请看我的问题