2017-06-08 3 views
2

私はGANについて学びたいと思っています。私はthe example hereを使って作業しています。TensorFlow Adamオプティマイザネームスペースにアクセスできない

アダム・オプティマイザを使用して、以下のコードは私にエラー

"ValueError: Variable d_w1/Adam/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?"

を与える私はTF 1.1.0

d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dx, labels=tf.fill([batch_size, 1], 0.9))) 
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dg, labels=tf.zeros_like(Dg))) 
d_loss = d_loss_real + d_loss_fake 

tvars = tf.trainable_variables() 

d_vars = [var for var in tvars if 'd_' in var.name] 
g_vars = [var for var in tvars if 'g_' in var.name] 



# Train the discriminator 
# Increasing from 0.001 in GitHub version 
with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope: 

    # Next, we specify our two optimizers. In today’s era of deep learning, Adam seems to be the 
    # best SGD optimizer as it utilizes adaptive learning rates and momentum. 
    # We call Adam's minimize function and also specify the variables that we want it to update. 
    d_trainer_real = tf.train.AdamOptimizer(0.0001).minimize(d_loss_real, var_list=d_vars) 
    d_trainer_fake = tf.train.AdamOptimizer(0.0001).minimize(d_loss_fake, var_list=d_vars) 

を使用している私は、アダム・オプティマイザは、独自の名前空間に変数を取っていると思います何らかの理由で初期化されていません。 githubページにあるように、後でglobal_variables_initializerというコードを呼び出します。私は文書を調べていますが、私はそれがreuse_variables()コールを何か入れなければならないことに関連しているかもしれないと思いますが、わかりません。

ご迷惑をおかけして申し訳ございません。

+0

ディスクリミネータ用に2つのオプティマイザを使用していることを考慮して、この例がベストプラクティスであるかどうかはわかりません。すでに定義されているd_lossを使用して単一のオプティマイザを使用すると、この問題を完全に回避することができます。 – jasekp

+0

また、弁別器出力の活性化は線形であり、シグモイド(または0から1の範囲のもの)でなければならない。これは、識別器の分類が0タイムステップの結果で否定的な理由を説明します。 – jasekp

+0

@ jasekpだからあなたは何をアドバイスしますか? discriminatorのための1つのオプティマイザを持つことは、まだ私にエラーを与える。私はこれを働かせて、Adamオプティマイザを理解したいと思っています。問題が何であるかと思います。私はいつも後でもっと例を見ることができますか?どのように私はそれが働くことができる任意のアイデア?ありがとう! –

答えて

0

あなたのValueErrorは、variable_scope.reuse == True内に新しい変数を作成することによって発生します。

変数は、Adamの最小化関数を呼び出すと、グラフの各訓練可能変数の勢いを保存するために作成されます。

実際、コード "reuse = False"は期待通りに機能しません。再利用状態はTrueに設定すると永遠にFalseに戻ることはできず、すべてのサブスコープで再利用状態が継承されます。

with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope: 
    assert tf.get_variable_scope().reuse == True 

私はあなたのように、デフォルトのvariable_scope.reuse ==真のポストコード、前にどこかにTrueに再利用を設定していると思います。次に、Adamの新しいvariable_scopeを作成しますが、新しいスコープはデフォルトスコープの再使用状態を継承します。次に、Adamは変数under state reuse == Trueを作成し、エラーを発生させます。

解決策は、variable_scope.reuse = Trueを設定するとグラフのデフォルトスコープの下にサブスコープを追加することです。デフォルトのscope.reuseは引き続きFalseで、Adam.minimizeは機能します。

関連する問題