Как передать скаляр через словарь фида TensorFlow
В моей модели TensorFlow используется tf.random_uniform
для инициализации переменной. Я хотел бы указать диапазон, когда я начинаю обучение, поэтому я создал местозаполнитель для значения инициализации.
init = tf.placeholder(tf.float32, name="init")
v = tf.Variable(tf.random_uniform((100, 300), -init, init), dtype=tf.float32)
initialize = tf.initialize_all_variables()
Я инициализирую переменные в начале обучения так.
session.run(initialize, feed_dict={init: 0.5})
Это дает мне следующую ошибку:
ValueError: initial_value must have a shape specified: Tensor("Embedding/random_uniform:0", dtype=float32)
Я не могу определить правильный параметр shape
, чтобы перейти к tf.placeholder
. Я бы подумал, что для скаляра я должен сделать init = tf.placeholder(tf.float32, shape=0, name="init")
, но это дает следующую ошибку:
ValueError: Incompatible shapes for broadcasting: (100, 300) and (0,)
Если я заменил init
литеральным значением 0.5
в вызове tf.random_uniform
, он будет работать.
Как передать это скалярное начальное значение через словарь фида?
Ответы
Ответ 1
TL; DR: Определите init
со скалярной формой следующим образом:
init = tf.placeholder(tf.float32, shape=(), name="init")
Это выглядит как неудачная деталь реализации tf.random_uniform()
: в настоящее время она использует tf.add()
и tf.multiply()
для масштабирования случайного значения из [-1, +1] - [minval
, maxval
], но если форма minval
или maxval
неизвестна, tf.add()
и tf.multiply()
не могут выводить правильные фигуры, потому что там может участвовать в трансляции.
Определив init
с известной формой (где скаляр ()
или []
, а не 0
), TensorFlow может сделать правильные выводы о форме результата tf.random_uniform()
, а ваш программа должна работать по назначению.