Изменить инициализатор переменной в Tensorflow

У меня есть предопределенный код, который создает график Tensorflow. Переменные содержатся в области видимости переменных, и каждая имеет предопределенный инициализатор. Есть ли способ изменить инициализатор переменных?

пример: первый график определяет

with tf.variable_scope('conv1')
    w = tf.get_variable('weights')

Позже я хотел бы изменить переменную и изменить инициализатор на Xavier:

 with tf.variable_scope('conv1')
     tf.get_variable_scope().reuse_variable()
     w = tf.get_variable('weights',initializer=tf.contrib.layers.xavier_initializer(uniform=False))

Однако, когда я повторно использую переменную, инициализатор не изменяется. позже, когда я сделаюinitialize_all_variables() Я получаю значения по умолчанию, а не Xavier. Как я могу изменить инициализатор переменной? Спасибо

 Yao Zhang24 июн. 2016 г., 19:43
Поскольку вы хотите совместно использовать / повторно использовать переменную, то есть только одна переменная, которая также должна иметь один инициализатор, и изменение инициализатора, по-видимому, не имеет смысла концептуально для этого случая; Вероятно, именно поэтому Tensorflow не позволяет вам изменить его. Можете ли вы просто добавить инициализатор к первому появлению tf.get_variable ('weights') или tf.variable_scope ('conv1')?

Ответы на вопрос(1)

Решение Вопроса

что инициализация не может быть изменена при настройке повторного использования (инициализация устанавливается во время первого блока).

Итак, просто определите его с инициализацией xavier во время первого вызова области видимости переменной. Таким образом, первый вызов будет, а затем инициализация всех переменных будет правильной:

with tf.variable_scope(name) as scope:
    kernel = tf.get_variable("W",
                             shape=kernel_shape, initializer=tf.contrib.layers.xavier_initializer_conv2d())
    # you could also just define your network layer 'now' using this kernel
    # ....
    # Which would need give you a model (rather just weights)

Если вам нужно повторно использовать набор весов, второй вызов может получить вам его копию.

with tf.variable_scope(name, reuse=True) as scope:
    kernel = tf.get_variable("W")
    # you can now reuse the xavier initialized variable
    # ....
 campellcl16 февр. 2019 г., 22:12
Я столкнулся с той же проблемой, что и @aarbelle, за исключением того, что вычислительный граф уже был определен в модуле TFHub (поэтому я не могу определить его изначально с помощью пользовательского инициализатора). Действительно ли невозможно изменить инициализатор до запуска операции глобальной инициализации в контексте сеанса?

Ваш ответ на вопрос