TensorFlow: генерация случайной константы

В ipython я импортировал tensorflow as tf а также numpy as np и создал TensorFlow InteractiveSession, Когда я запускаю или инициализирую нормальное распределение с пустым вводом, все работает нормально:

some_test = tf.constant(np.random.normal(loc=0.0, scale=1.0, size=(2, 2)))
session.run(some_test)

Возвращает:

array([[-0.04152317,  0.19786302],
       [-0.68232622, -0.23439092]])

Как и ожидалось.

... но когда я использую функцию нормального распределения Tensorflow:

some_test = tf.constant(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32))
session.run(some_test)

... возникает ошибка типа, говорящая:

(...)
TypeError: List of Tensors when single Tensor expected

Что мне здесь не хватает?

Выход из:

sess.run(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32))

один возвращает ту же самую вещь, которая np.random.normal генерирует -> матрицу формы (2, 2) со значениями, взятыми из нормального распределения.

1 ответ

Решение

tf.constant() op принимает массив numpy (или что-то неявно преобразуемое в массив numpy) и возвращает tf.Tensor значение которого совпадает с этим массивом. Не принимает tf.Tensor в качестве аргумента.

С другой стороны, tf.random_normal() оп возвращает tf.Tensor значение которого генерируется случайным образом в соответствии с заданным распределением при каждом запуске. Так как он возвращает tf.Tensor, он не может быть использован в качестве аргумента tf.constant(), Это объясняет TypeError (который не связан с использованием tf.InteractiveSession, поскольку это происходит при построении графика).

Я предполагаю, что вы хотите, чтобы ваш график включал тензор, который (i) генерируется случайным образом при первом его использовании, и (ii) постоянный после него. Есть два способа сделать это:

  1. Используйте NumPy, чтобы сгенерировать случайное значение и поместить его в tf.constant(), как вы сделали в своем вопросе:

    some_test = tf.constant(
        np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32))
    
  2. (Потенциально быстрее, поскольку он может использовать графический процессор для генерации случайных чисел). Используйте TensorFlow для генерации случайного значения и поместите его в tf.Variable:

    some_test = tf.Variable(
        tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)
    sess.run(some_test.initializer)  # Must run this before using `some_test`
    
Другие вопросы по тегам