Я пытаюсь реализовать Adversarial NN, который требует "заморозить" одну или другую часть графика во время чередующихся миниатюр тренировок. То есть есть две подсерии: G и D.
G( Z ) -> Xz
D( X ) -> Y
где функция потерь G
зависит от D[G(Z)], D[X]
.
Сначала мне нужно настроить параметры в D со всеми фиксированными параметрами G, а затем параметры в G с параметрами в D фиксированными. Функция потерь в первом случае будет отрицательной функцией потерь во втором случае, и обновление должно будет применяться к параметрам первой или второй подсети.
Я видел, что у тензорного потока есть функция tf.stop_gradient
. Для обучения D (нисходящей) подсети я могу использовать эту функцию для блокировки потока градиента до
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
tf.stop_gradient
очень кратко аннотируется без примера в строке (и пример seq2seq.py
слишком длинный и не так прост для чтения), но выглядит так, как будто он должен вызываться во время создания графика. Означает ли это, что если я хочу блокировать/разблокировать поток градиента в чередующихся партиях, мне нужно заново создать и повторно инициализировать модель графа?
Также кажется, что нельзя заблокировать градиент, проходящий через сеть G (вверх по течению) с помощью tf.stop_gradient
, справа?
В качестве альтернативы я увидел, что можно перечислить список переменных для вызова оптимизатора как opt_op = opt.minimize(cost, <list of variables>)
, что было бы простым решением, если бы можно было получить все переменные в области каждой подсети. Можно ли получить <list of variables>
для tf.scope?