Должен ли я инициализировать переменные самостоятельно или просто инициализировать с помощью global_variable_initialize ()? - PullRequest
0 голосов
/ 04 мая 2018

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

Странно просто вызывать функцию и инициализировать все переменные для меня. Я слышал, что global_variable_initialize () извлекает список переменных, который содержит: [все веса, все смещения, все скрытое состояние], но это как черный ящик для незнания диапазона переменных, и я не использую предвзятость, когда сам пишешь сеть.

Для пользователей тензорного потока вы предпочитаете инициализировать переменную самостоятельно (например, с помощью tf.Variable)? Есть ли проблема или недостаток для простого вызова global_variable_initialize ()?

Надеюсь узнать мнение каждого, спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Мне также не нравится использование global_variable_initialize. Фактически, переменная может быть эффективно и кратко определена с использованием TF-SLIM.
Я цитирую документацию TensorFlow-Slim .

Создание переменных в собственном тензорном потоке требует либо предопределенного значения, либо механизма инициализации (например, случайная выборка из гауссиана). Кроме того, если переменная должна быть создана на определенном устройстве, таком как графический процессор, спецификация должна быть сделана явной. Чтобы облегчить код, необходимый для создания переменных, TF-Slim предоставляет набор функций тонкой оболочки в variables.py, которые позволяют вызывающим программам легко определять переменные.

Например, чтобы создать весовую переменную, инициализировать ее с помощью усеченного нормального распределения, упорядочить ее с помощью l2_loss и поместить ее в ЦП, нужно только объявить следующее:

weights = slim.variable('weights', shape=[10, 10, 3 , 3],  
                        initializer=tf.truncated_normal_initializer(stddev=0.1),   
                        regularizer=slim.l2_regularizer(0.05), device='/CPU:0')
0 голосов
/ 04 мая 2018

Инициализатор глобальных переменных - не черный ящик, он использует коллекции GraphKeys, как хорошо описано здесь:

Использование tf.GraphKeys

Большинство операций в тензорном потоке добавляют переменные в соответствующую коллекцию в соответствии с соглашением. Оптимизаторы используют эти же наборы, чтобы решить, какие переменные являются обучаемыми, а не по умолчанию. Глядя на соответствующую коллекцию.

По моему опыту большинство всего является глобальной переменной, за исключением переменных, создаваемых пакетами tf.metrics.*, которые по умолчанию являются локальными переменными (поэтому вы можете сбросить метрики с помощью инициализатора локальных переменных).

...