tensorflow:提示找不到Adam或者RMSProp變量,Did you mean to set reuse=None in VarScope?

錯誤的完整信息

Variable discriminator/conv/weights/RMSProp/does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

這個錯誤是在使用優化函數


tf.train.RMSPropOptimizer()


tf.train.AdamOptimizer()

引起的,使用梯度下降算法反而沒有出現問題,
並且使用了
tf.get_variable_scope().reuse_variables()
原因是使用Adam或者RMSProp優化函數時,Adam函數會創建一個Adam變量,目的是保存你使用tensorflow創建的graph中的每個可訓練參數的動量,但是這個Adam是在reuse=True條件下創建的,之後reuse就回不到None或者False上去,當reuse=True,就會在你當前的scope中reuse變量,如果在此scope中進行優化操作,就是使用AdamOptimizer等,他就會重用slot variable,這樣子會導致找不到Adam變量,進而報錯。

設置reuse=True的地方是

tf.get_variable_scope().reuse_variables()

或者

With tf.variable_scope(name) as scope :
       Scope.reuse_variables()

一般在運行GAN程序的時候會用到這段代碼。解決方法就是將這個scope獨立出來,reuse=True就只在當前scope中起作用,使用

With tf.variable_scope(tf.get_variables_scope())

把它放在需要調用函數的地方,我這裏是discriminator函數:
代碼更改如下所示:
Wrong:

       G = generator(z)
       D, D_logits = discriminator(images)
       samples = sampler(z)
       D_, D_logits_ = discriminator(G, reuse=True)

True:

   with tf.variable_scope("for_reuse_scope"):
       G = generator(z)
       D, D_logits = discriminator(images)
       samples = sampler(z)
       D_, D_logits_ = discriminator(G, reuse=True)

我看有的人說在使用優化函數的上面加with。。。這句話,但是我試用了並沒有用。
類似這樣:

   with tf.variable_scope(tf.get_variable_scope(), reuse=None):#新增
       d_optim = tf.train.RMSPropOptimizer(LR).minimize(d_loss,var_list=d_vars, global_step=global_step)
       g_optim = tf.train.RMSPropOptimizer(LR).minimize(g_loss,var_list=g_vars, global_step=global_step)

另外,出現此問題的原因也可能是在該複用網絡參數的時候沒有複用,複用時要設置reuse= True

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章