Как передать скаляр через словарь фида 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(), а ваш программа должна работать по назначению.