錯誤的完整信息
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