я пытаюсь построить GAN для проекта, и мне очень нравится понимать, как работает это совместное использование переменных в tensorflow variable_scope.
Для построения GAN у меня есть сеть генератора и две сети дискриминатора: один дискриминатор получает настоящие изображения, а один дискриминатор — поддельные изображения, созданные генератором. Важно то, что дискриминатор, получающий настоящие изображения, и дискриминатор, получающий поддельные изображения, должны иметь одинаковые веса. Для этого мне нужно разделить веса.
У меня есть определение дискриминатора и генератора, скажем:
def discriminator(images, reuse=False):
with variable_scope("discriminator", reuse=reuse):
#.... layer definitions, not important here
#....
logits = tf.layers.dense(X, 1)
logits = tf.identity(logits, name="logits")
out = tf.sigmoid(logits, name="out")
# 14x14x64
return logits, out
def generator(input_z, reuse=False):
with variable_scope("generator", reuse=reuse):
#.. not so important
out = tf.tanh(logits)
return out
Теперь вызываются функции генератора и дискриминатора:
g_model = generator(input_z)
d_model_real, d_logits_real = discriminator(input_real)
#Here , reuse=True should produce the weight sharing between d_model_real, d_logits_real
#and d_model_fake and d_logits_fake.. why?
d_model_fake, d_logits_fake = discriminator(g_model, reuse=True)
Почему оператор reuse=True в вызове second приводит к совместному использованию весов? Насколько я понимаю, вам нужно решить повторное использование переменных в первом вызове, чтобы вы могли использовать их где-то позже в программе.
Я был бы очень рад, если бы кто-нибудь мог объяснить это мне, я не нахожу хорошего источника по этой теме, и это кажется мне очень запутанным и сложным. Благодарю вас!