美文网首页
变量重名

变量重名

作者: 填坑组长 | 来源:发表于2017-07-18 22:56 被阅读0次

背景描述:编写Adversarial Autoencoder的代码,enocder部分的权值在对抗训练时会接受来自reconstruct和discriminator两个方面的gradient,在初始化不同损失函数时,会出现问题。

问题代码:

# 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?

其中各个函数如下,问题出现在上面代码的第三行

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)

问题猜想:
报错的地方会产生一些“影子变量”用于optimizer对变量的更新(求出来的梯度?),故想办法改变这些“影子变量”的scope就可以。

解决方法:
AdamOptimizer创建的时候传入name参数(不使用默认的参数),比如对于第三个函数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)

相关文章

  • 变量重名

    背景描述:编写Adversarial Autoencoder的代码,enocder部分的权值在对抗训练时会接受来自...

  • 继承 extends

    继承中成员变量的访问特点 1、父子类继承关系中,成员变量重名时,子类对象访问重名变量的2种方式 子类对象直接访问成...

  • es6 解构赋值取别名

    当解构时,发现变量重名了,可设置别名区分

  • JAVA面向对象

    1、this 用于区别成员变量与局部变量重名 在成员变量前面添加 this. 2、构造方法 A 构造方法概述: ...

  • 变量提升练习题

    变量提升细节知识点 1.return 后面不进行变量提升,但是return下面的还是要变量提升2.重名变量不会重复...

  • npm es6

    npm installnpm update es6 let 不允许声明重名的变量 不存在变量提升 if(false...

  • ECMAScript6 新增语法

    let 作用域在代码块 用在for循环里面 在作用域内变量重名报错 没有变量提升 死区 函数

  • 全局变量和局部变量

    局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。要使用全局变量,需要使用::。在函数体内引用变量会用到同名...

  • 34.2Chapter区分子类中3种重名的变量 继承中成员方法的

    区分子类中3种重名的变量 子类的局部变量 方法里直接调用变量名 子类的成员变量 this.变量名 父类的成员变量...

  • 9道常见C语言面试题

    1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量...

网友评论

      本文标题:变量重名

      本文链接:https://www.haomeiwen.com/subject/pikkkxtx.html