變量重名

背景描述:編寫Adversarial Autoencoder的代碼,enocder部分的權(quán)值在對抗訓(xùn)練時會接受來自reconstruct和discriminator兩個方面的gradient,在初始化不同損失函數(shù)時,會出現(xiàn)問題。

問題代碼:

# initialize optimizers
self.loss_encoder_decoder, self.opt_encoder_decoder = self.optimizer_encoder_decoder()
self.loss_discriminator, self.opt_discriminator = self.optimizer_discriminator()
self.loss_encoder, self.opt_encoder = self.optimizer_encoder()

tensorflow錯誤輸出:
ValueError: Variable AAE/Encoder/layer_0/W/Adam/ already exists, disallowed. Did you mean to set reuse=True in VarScope?

其中各個函數(shù)如下,問題出現(xiàn)在上面代碼的第三行。

def optimizer_encoder_decoder(self):
    vars = self.encoder.vars
    vars.extend(self.decoder.vars)
    optimizer = tf.train.AdamOptimizer(learning_rate=self.learn_rate)
    return loss, optimizer.minimize(loss, var_list=vars)
def optimizer_discriminator(self):
    optimizer = tf.train.AdamOptimizer(learning_rate=self.learn_rate)
    return loss, optimizer.minimize(loss, var_list=self.disor.vars)
def optimizer_encoder(self):
    optimizer = tf.train.AdamOptimizer(learning_rate=self.learn_rate)
    return loss, optimizer.minimize(loss, var_list=self.encoder.vars)

問題猜想:
報錯的地方會產(chǎn)生一些“影子變量”用于optimizer對變量的更新(求出來的梯度?),故想辦法改變這些“影子變量”的scope就可以。

解決方法:
AdamOptimizer創(chuàng)建的時候傳入name參數(shù)(不使用默認的參數(shù)),比如對于第三個函數(shù)optimizer_encoder

def optimizer_encoder(self):
    optimizer = tf.train.AdamOptimizer(learning_rate=self.learn_rate, name='Adam_en')
    return loss, optimizer.minimize(loss, var_list=self.encoder.vars)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容