Как выполнить весовую инициализацию по правилу Ксавье в Tensorflow 2.0? - PullRequest
3 голосов
/ 24 марта 2019

TF 2.0 случайно избавился от библиотеки contrib.Поэтому все вкусности, такие как tf.contrib.conv2d или tf.contrib.layers.variance_scaling_initializer, пропали.Тем не менее, что, по вашему мнению, было бы наилучшим способом инициализации Xavier в TF2.0 без использования Keras (или инициализации с помощью какого-нибудь наглого хака)?

А именно, я придерживаюсь tf.nn.conv2d и для этогофункция Я один, предоставляющий веса:

filters = tf.Variable(tf.zeros([3, 3, 32, 64]))
??? # something should happen hear, i guess
net = tf.nn.conv2d(input, filters)

Примечание: На всякий случай, если вы используете первую версию TF, вы можете просто пойти с:

filters = tf.get_variable("w", shape=[3,3, 32, 64],
           initializer=tf.contrib.layers.xavier_initializer()) 
# no tf.contrib in 2.0, no tf.get_variable in 2.0

Ответы [ 2 ]

7 голосов
/ 24 марта 2019

В tenorflow 2.0 у вас есть пакет tf.initializer со всеми необходимыми Keras-подобными инициализаторами.

Инициализатор Xavier такой же, как инициализатор Glorot Uniform. Таким образом, чтобы создать переменную (3,3) со значениями, выбранными из этого инициализатора, вы можете просто:

shape = (3,3)
initializer = tf.initializers.GlorotUniform()
var = tf.Variable(initializer(shape=shape))
1 голос
/ 24 марта 2019

Просто используйте glorot uniform initializer, что совпадает с xavier initializer.

Источник: https://www.tensorflow.org/api_docs/python/tf/glorot_uniform_initializer

Также вот пример, чтобы доказать, что они одинаковы:

tf.reset_default_graph()
tf.set_random_seed(42)
xavier_var = tf.get_variable("w_xavier", shape=[3, 3], initializer=tf.contrib.layers.xavier_initializer())
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(xavier_var))
# [[ 0.27579927 -0.6790426  -0.6128938 ]
#  [-0.49439836 -0.36137486 -0.7235348 ]
#  [-0.23143482 -0.3394227  -0.34756017]]
tf.reset_default_graph()
tf.set_random_seed(42)
glorot_var = tf.get_variable("w_glorot", shape=[3, 3], initializer=tf.glorot_uniform_initializer())
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(glorot_var))
# [[ 0.27579927 -0.6790426  -0.6128938 ]
#  [-0.49439836 -0.36137486 -0.7235348 ]
#  [-0.23143482 -0.3394227  -0.34756017]]

Кроме того, если вы хотите glorot uniform initializer с tf.Variable, вы можете сделать:

tf.reset_default_graph()
tf.set_random_seed(42)
normal_var = tf.Variable(tf.glorot_uniform_initializer()((3, 3)))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(normal_var))
# [[ 0.27579927 -0.6790426  -0.6128938 ]
#  [-0.49439836 -0.36137486 -0.7235348 ]
#  [-0.23143482 -0.3394227  -0.34756017]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...