如何在循环中不断更新张量的值

How to continuously update the value of a tensor in a loop

所以我试图通过在每次迭代中为它分配一个新值来在循环中不断更新我的代码中的张量。 genRandMat 函数为变量 a1 分配一个 运行dom MxN 矩阵,包含 0 和 1,频率为 1以概率 pt.

决定

这是我的代码 运行 -

np.random.seed(0)
tf.set_random_seed(0)
def genRandMat(M,N,pt):
    return tf.convert_to_tensor(np.random.choice([0, 1], size=(M,N), p=[1-pt, pt]), dtype=tf.float32)

a1=tf.Variable(genRandMat(1,10,0.5))
a2=a1.assign(genRandMat(1,10,0.5))
init = tf.global_variables_initializer()


with tf.Session() as sess:
    sess.run(init)
    for i in range(5):
        print(a1.eval())
        sess.run(a2)
        print(a1.eval())
        print("*************")

我期望的结果是在每第二个打印语句之后都有一个新的 运行dom 张量(由于更新语句 a2),即第 2、4、6... 矩阵应该更新,新 运行dom矩阵。

这是我得到的

[[0. 0. 1. 1. 0. 0. 1. 1. 1. 0.]]
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
*************
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
*************
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
*************
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
*************
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
[[1. 1. 1. 1. 0. 1. 0. 0. 1. 1.]]
*************

如你所见,a1 的值在第二个 print 语句开始时改变了一次,然后就不再改变了。我尝试注释掉两个 运行dom 种子,但结果没有改变。每次更新语句后我都想要一个新矩阵。我怎样才能做到这一点?

您已经生成了随机值,并且您再次分配相同的值。每次需要使用 TensorFlow API 而不是 numpy 生成随机值时分配不同的值。

或者,您可以使用 tf.Variable.load():

在不创建图形操作的情况下分配新值
import numpy as np
import tensorflow as tf
np.random.seed(0)
tf.set_random_seed(0)

def rand_mat(M=1, N=10, pt=0.5):
    return np.random.choice([0, 1], size=(M,N), p=[1-pt, pt])

a1 = tf.Variable(rand_mat(1, 10, 0.5))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for _ in range(5):
        print(a1.eval())
        a1.load(rand_mat())
        print(a1.eval())
        print()
# [[1 1 1 1 0 1 0 1 1 0]]
# [[1 1 1 1 0 0 0 1 1 1]]
# 
# [[1 1 1 1 0 0 0 1 1 1]]
# [[1 1 0 1 0 1 0 1 1 0]]
# 
# [[1 1 0 1 0 1 0 1 1 0]]
# [[0 1 0 1 0 1 1 1 1 1]]
# 
# [[0 1 0 1 0 1 1 1 1 1]]
# [[0 0 1 0 1 1 0 0 0 0]]
# 
# [[0 0 1 0 1 1 0 0 0 0]]
# [[1 0 1 0 0 0 1 0 0 0]]

使用 TensorFlow API 你可以这样做:

import tensorflow as tf

randint = tf.round(tf.random.uniform(shape=(1, 10)))

with tf.Session() as sess:
    for _ in range(5):
        print(randint.eval())
        print()
# [[1. 0. 1. 1. 1. 1. 1. 1. 1. 1.]]
# 
# [[1. 1. 0. 0. 1. 0. 0. 0. 1. 0.]]
# 
# [[1. 1. 0. 0. 1. 1. 0. 0. 0. 1.]]
# 
# [[0. 0. 0. 1. 1. 0. 1. 0. 1. 1.]]
# 
# [[1. 1. 1. 0. 0. 0. 0. 1. 1. 1.]]