Есть ли альтернативы для constant_initializer при назначении весов в tf.contrib.layers - PullRequest
1 голос
/ 17 мая 2019

Я хочу передать веса на tensorflow.contrib.layers.conv2d.Слои имеют параметр weights_initializer.При передаче тензора через weights_initializer=tf.constant_initializer(tensor) тензор дополнительно добавляется в виде узла на график, что приводит к увеличению размера модели.

Есть ли альтернатива этой весовой инициализации?

Я знаю, что tf.nn.conv2d принимает веса в качестве параметра.Однако текущая модель, с которой я работаю, использует contrib-слои.

1 Ответ

3 голосов
/ 17 мая 2019

Если вы хотите инициализировать веса некоторой константой, но не хотите сохранять эту константу в графе, можете использовать заполнитель и передать значение для него при инициализации.Просто получите что-то вроде:

weight_init = tf.placeholder(tf.float32, <shape>)
# As a parameter to your layer
weights_initializer=lambda *a, **k: weight_init

Обратите внимание, что форма weight_init должна соответствовать размеру тензора весов.Затем при инициализации:

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op, feed_dict={weight_init: <initial weight value>})

В качестве альтернативы вы можете не использовать инициализатор и вместо вызова операции инициализации использовать метод load переменной веса.Для этого вам сначала нужно получить доступ к этой переменной:

with tf.Session() as sess:
    weight_var.load(<initial weight value>, session=sess)
...