Переменные обмена тензорными потоками под разными переменными_scope

64
9

У меня три сети, назовите их V, V_target и Actor, и я пытаюсь выполнить следующую настройку:

V и Актер разделяют определенные слои. V_target является точным дубликатом V.

Для тех, кто знаком с глубоким RL, я использую это в алгоритме актер-критик с общими слоями между ценностными и политическими сетями, а также целевой сетью V_target. Я попробовал следующее:

def shared(...):
# define some variables, e.g.
W = get_variable('W', ...)

def Actor(...):
with tf.variable_scope("shared"):
shared_out = shared(...)
... actor-specific layers ...

def V(...):
with tf.variable_scope("shared", reuse=True):
shared_out = shared(...)
... V-specific layers...

with tf.variable_scope("Policy"):
actor_out = Actor(...)
with tf.variable_scope("V_main"):
V_out = V(...)
with tf.variable_scope("V_target"):
V_target = V(...)

Как и ожидалось, это не работает, потому что использование самой внешней variable_scope предотвращает совместное использование политики и V_main: переменная W имеет имя Policy/shared/W в одной области действия, но имеет имя V_main/shared/W под второй областью.

Почему бы не использовать tf.name_scope("Policy") и tf.name_scope("V_main")? Если я это сделаю, shared переменные могут быть определены, но тогда у меня нет хорошего способа получить переменные под V_main и V_target. В частности, поскольку tf.name_scope ничего не добавляет к именам, созданным tf.get_variable, я не могу использовать tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES ,'V_main') и tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES ,'V_target') для получения обоих наборов объектов для так называемых "целевых обновлений".

Есть ли какой-нибудь умный способ обойти это?

спросил(а) 2021-01-25T13:52:44+03:00 4 месяца, 2 недели назад
1
Решение
77

Я предлагаю вам сделать трюк, описанный в этом вопросе: Как создать переменную за пределами текущей области в Tensorflow?

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

Поэтому вам просто нужно определить tf.variable_scope("shared") один раз, запомнить ссылку на этот экземпляр и использовать его во всех других областях переменных (с reuse=True). Переменная W будет создана в shared области видимости независимо от того, какова внешняя область.

ответил(а) 2021-01-25T13:52:44+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема