[英]How to assign a value to a TensorFlow variable?
我正在嘗試為 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 中,語句x.assign(1)
實際上並未將值1
分配給x
,而是創建了一個tf.Operation
,您必須顯式運行該Operation.run()
以更新變量。* 對Operation.run()
或Session.run()
調用Session.run()
可用於運行操作:
assign_op = x.assign(1)
sess.run(assign_op) # or `assign_op.op.run()`
print(x.eval())
# ==> 1
(* 實際上,它返回一個tf.Tensor
,對應於變量的更新值,以便更容易地進行鏈式賦值。)
但是,在 TF2 x.assign(1)
現在會急切地分配值:
x.assign(1)
print(x.numpy())
# ==> 1
您還可以為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 中已被棄用,因為 Eager Execution 是默認設置,並且圖形不再在面向用戶的 API 中公開。
首先,您可以將值分配給變量/常量,只需像使用占位符一樣將值輸入它們即可。 所以這樣做是完全合法的:
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)
另外,必須注意的是,如果您使用的是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
的變量。
我在這里回答了一個類似的問題。 我查看了很多總是會產生相同問題的地方。 基本上,我不想為權重賦值,而是簡單地改變權重。 上述答案的簡短版本是:
tf.keras.backend.set_value(tf_var, numpy_weights)
這是完整的工作示例:
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(基於我們的成本函數)。
注意:您最初使用的是交互式會話。 當需要在同一個腳本中運行多個不同的會話時,交互式會話非常有用。 但是,為了簡單起見,我使用了非交互式會話。
使用最新的 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]))
在這里,我正在創建一個變量並同時為其賦值
有一個更簡單的方法:
x = tf.Variable(0)
x = x + 1
print x.eval()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.