Как постоянно обновлять значение тензора в цикле - PullRequest
1 голос
/ 07 июня 2019

Поэтому я пытаюсь постоянно обновлять тензор в моем коде в цикле, присваивая ему новое значение в каждой итерации.Функция genRandMat назначает переменную a1 со случайной 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("*************")

Результат, который я ожидал, был новым случайным тензором после каждого второго оператора печати (из-за оператора обновления a2), то есть 2-я, 4-я, 6-я ... матрицы должны быть обновленыновые случайные матрицы.

Вот что я получил вместо

[[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 изменяется один раз в начале со вторым оператором печати, а затем уже нет.Я попытался закомментировать оба случайных семени, но результат не изменился.Я хочу новую матрицу после каждого обновления.Как мне этого добиться?

1 Ответ

1 голос
/ 07 июня 2019

Вы сгенерировали случайные значения, и вы продолжаете назначать то же значение снова. Чтобы назначать разные значения каждый раз, вам нужно генерировать случайные значения с помощью API TensorFlow, а не 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.]]

...