Tensorflow: Как скопировать весовые коэффициенты конвульного слоя в другую переменную для использования в обучении с подкреплением? - PullRequest
0 голосов
/ 29 декабря 2018

Я не уверен, возможно ли это в Tensorflow, и я обеспокоен тем, что мне, возможно, придется переключиться на pytorch.

В принципе, у меня есть этот парень: self.policy_conv1 =

tf.layers.conv2d(inputs=self.policy_s, filters=16, kernel_size=(8,8),strides=(4,4), padding = 'valid',activation=tf.nn.relu, kernel_initializer=tf.glorot_uniform_initializer, bias_initializer = tf.glorot_uniform_initializer)

Кого я пытаюсь скопировать в этого парня, каждые 100 итераций обучения или около того:

self.eval_conv1 = tf.layers.conv2d(inputs=self.s, filters=16, kernel_size=(8,8),strides=(4,4), padding = 'valid', activation=tf.nn.relu, kernel_initializer=tf.glorot_uniform_initializer, bias_initializer = tf.glorot_uniform_initializer)

TF.Assign не кажется правильным инструментом, а следующее не 'Кажется, что это не работает:

self.policy_conv1 = tf.stop_gradient(tf.identity(self.eval_conv1))

По сути, я хочу скопировать слой eval conv в слой conv политики, а не связывать их каждый раз, когда граф выполняет одну или другую переменную (чтопроисходит с фрагментом идентификатора выше).Если кто-то может указать мне нужный код, я был бы признателен.

1 Ответ

0 голосов
/ 29 декабря 2018
import numpy as np
import tensorflow as tf

# I'm using placeholders, but it'll work for other inputs as well
ph1 = tf.placeholder(tf.float32, [None, 32, 32, 3])
ph2 = tf.placeholder(tf.float32, [None, 32, 32, 3])

l1 = tf.layers.conv2d(inputs=ph1, filters=16, kernel_size=(8,8),strides=(4,4), padding = 'valid',activation=tf.nn.relu, kernel_initializer=tf.glorot_uniform_initializer, bias_initializer = tf.glorot_uniform_initializer, name="layer_1")
l2 = tf.layers.conv2d(inputs=ph2, filters=16, kernel_size=(8,8),strides=(4,4), padding = 'valid',activation=tf.nn.relu, kernel_initializer=tf.glorot_uniform_initializer, bias_initializer = tf.glorot_uniform_initializer, name="layer_2")

sess = tf.Session()
sess.run(tf.global_variables_initializer())

w1 = tf.get_default_graph().get_tensor_by_name("layer_1/kernel:0")
w2 = tf.get_default_graph().get_tensor_by_name("layer_2/kernel:0")

w1_r = sess.run(w1)
w2_r = sess.run(w2)
print(np.sum(w1_r - w2_r)) # non-zero

sess.run(tf.assign(w2, w1))
w1_r = sess.run(w1)
w2_r = sess.run(w2)
print(np.sum(w1_r - w2_r)) # 0

w1 = w1 * 2 + 1
w1_r = sess.run(w1)
w2_r = sess.run(w2)
print(np.sum(w1_r - w2_r)) # non-zero

layer_1/bias:0 должно работать для получения условий смещения.

ОБНОВЛЕНИЕ:

Я нашел более простой способ:

update_weights = [tf.assign(new, old) for (new, old) in 
   zip(tf.trainable_variables('new_scope'), tf.trainable_vars('old_scope'))]

Выполнение sess.run на update_weights следует скопировать веса из одной сети в другую.Просто не забудьте построить их под отдельными областями имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...