如何为TensorFlow变量赋值?

时间:2015-12-11 09:51:46

标签: 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

所以价值没有改变。我错过了什么?

9 个答案:

答案 0 :(得分:110)

语句x.assign(1)实际上并未将值1分配给x,而是创建一个必须明确运行tf.Operation更新变量。*可以使用对Operation.run()Session.run()的调用来运行操作:

assign_op = x.assign(1)
sess.run(assign_op)  # or `assign_op.op.run()`
print(x.eval())
# ==> 1

(*实际上,它返回一个tf.Tensor,对应于变量的更新值,以便更容易进行链分配。)

答案 1 :(得分:35)

您还可以为tf.Variable分配新值,而无需向图表添加操作:tf.Variable.load(value, session)。此函数还可以在从图表外部指定值时保存添加占位符,并且在图表完成时非常有用。

import tensorflow as tf
x = tf.Variable(0)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(x))  # Prints 0.
x.load(1, sess)
print(sess.run(x))  # Prints 1.

更新:这在TF2中被删除,因为急切执行是默认的,图表是no longer exposed in the user-facing API

答案 2 :(得分:14)

首先,您可以将值赋值给变量/常量,只需将值输入到它们中,就像使用占位符一样。所以这是完全合法的:

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.assign()运营商的混淆。在TF中,在会话内部运行之前不会执行任何操作。因此,您必须执行以下操作:op_name = tf.some_function_that_create_op(params),然后在会话内运行sess.run(op_name)。使用assign作为示例,您将执行以下操作:

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)

答案 3 :(得分:3)

另外,必须注意的是,如果您使用your_tensor.assign(),则无需显式调用tf.global_variables_initializer,因为分配操作会在后台为您执行此操作。

示例:

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的变量。

答案 4 :(得分:0)

这是完整的工作示例:

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.049999997,再经过10.000步,我们达到-2.499994(基于成本函数)。 / p>

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

答案 5 :(得分:0)

使用最新的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)

答案 6 :(得分:0)

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

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

在这里我要创建一个变量,并同时为其赋值

答案 7 :(得分:0)

我回答了类似的问题here。我在很多地方都发现了同样的问题。基本上,我不想为权重分配一个值,而只是更改权重。上述答案的简短版本是:

tf.keras.backend.set_value(tf_var, numpy_weights)

答案 8 :(得分:-9)

有一种更简单的方法:

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