簡體   English   中英

如何為 TensorFlow 變量賦值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM