質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

tf.get_variablesが定義されないためtf.train.AdamOptimizerが使えない原因

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,915

trafalbad

score 252

下記のようにGeneratorとDiscriminatorを定義したあとにtf.train.AdamOptimizerを使おうとすると下記エラーが出て使用できないのは何故なのでしょうか?

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

tf.train.GradientDescentOptimizer(1e-3)は使えるようですが、tf.train.AdamOptimizerを使わないと上手くいかないのです。どうしたらこのoptimizerが使えるようになるのでしょうか?
ご教授お願いいたします。

追記
早急に解決の必要があるためマルチポストをしてしましました。複数の人に見てもらった方が早く解決できると思ったからです。
リンク

def discriminator(image, reuse=False):
    batch_size=64
    with tf.variable_scope("discriminator") as scope:
        if reuse:
            scope.reuse_variales()

        h0 = lrelu(conv2d(image, 64, name='d_h0_conv'))
        h1 = lrelu(batch_norm(conv2d(h0, 128, name='d_h1_conv'),'d_bn1'))
        h2 = lrelu(batch_norm(conv2d(h1, 256, name='d_h2_conv'),'d_bn2'))
        h3 = lrelu(batch_norm(conv2d(h2, 512, name='d_h3_conv'),'d_bn3'))  # shape=(batch_size, 64, 64, 3) 
        h4 = linear_d(tf.reshape(h3, [batch_size, -1]),2,'d_h4_lin')
        return h4



    # shape=(batch_size, 64, 64, 3)
def generator(z_):
    batch_size=64
    with tf.variable_scope("generator") as scope:
        # project `z` and reshape
        z, h0_w, h0_b = linear(z_, 64*8*4*4, 'g_h0_lin',with_w=True)
        h0 = tf.nn.relu(batch_norm(tf.reshape(z, [-1, 4, 4, 64*8]), 'g_bn0'))
        h1, h1_w, h1_b = deconv2d(h0, [batch_size, 8, 8, 64*4], name='g_h1', with_w=True)
        h1 = tf.nn.relu(batch_norm(h1, 'g_bn1'))
        h2, h2_w, h2_b = deconv2d(h1, [batch_size, 16, 16, 64*2], name='g_h2', with_w=True)
        h2 = tf.nn.relu(batch_norm(h2, 'g_bn2'))
        h3, h3_w, h3_b = deconv2d(h2, [batch_size, 32, 32, 64*1], name='g_h3', with_w=True)
        h3 = tf.nn.relu(batch_norm(h3, 'g_bn3'))
        h4, h4_w, h4_b = deconv2d(h3, [batch_size, 64, 64, 3], name='g_h4', with_w=True)
        return tf.nn.tanh(h4)  #shape=(batch_size, 64, 64, 3)


def sampler(z_):# shape=(batch_size, 64, 64, 3) 
    batch_size=64
    with tf.variable_scope("generator") as scope:
        # project `z` and reshape
        z= linear(z_, 64*8*4*4,'g_h0_lin')
        h0 = tf.nn.relu(batch_norm(tf.reshape(z, [-1, 4, 4, 64*8]),'g_bn0',train=False))
        h1 = deconv2d(h0, [batch_size, 8, 8, 64*4], name='g_h1')
        h1 = tf.nn.relu(batch_norm(h1,'g_bn1',train=False))
        h2 = deconv2d(h1, [batch_size, 16, 16, 64*2], name='g_h2')
        h2 = tf.nn.relu(batch_norm(h2,'g_bn2',train=False))
        h3 = deconv2d(h2, [batch_size, 32, 32, 64*1], name='g_h3')
        h3 = tf.nn.relu(batch_norm(h3,'g_bn3',train=False))
        h4 = deconv2d(h3, [batch_size, 64, 64, 3], name='g_h4')
        return tf.nn.tanh(h4)  #shape=(batch_size, 64, 64, 3)

G=generator(z)  #G(z)
D_logits = discriminator(image) #D(x)

tf.get_variable_scope().reuse_variables()
sampler = sampler(z)
D_logits_ = discriminator(G)   #D(G(z))

batch_label=64

d_loss_real = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=D_logits, labels=tf.ones([batch_label], dtype=tf.int64)))
d_loss_fake = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=D_logits_, labels=tf.zeros([batch_label], dtype=tf.int64)))

g_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=D_logits_, labels=tf.ones([batch_label], dtype=tf.int64)))
d_loss = d_loss_real + d_loss_fake

d_vars = [var for var in tf.trainable_variables() if 'd_' in var.name]
g_vars = [var for var in tf.trainable_variables() if 'g_' in var.name]

saver=tf.train.Saver()


g_optim = tf.train.AdamOptimizer(learning_rate=0.0002, beta1=0.5).minimize(g_loss, var_list=g_vars)
d_optim = tf.train.AdamOptimizer(learning_rate=0.0002, beta1=0.5).minimize(d_loss, var_list=d_vars)

ValueError: Variable discriminator/d_h0_conv/w/Adam/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

回答 2

check解決した方法

0

tf.get_variable_scope().reuse_variables() 
を使わずに関数内でreuse=Trueを指定してあげれば解決しました

def sampler():# shape=(batch_size, 64, 64, 3) 
    reuse = False
    def model(z_):
        nonlocal reuse
        batch_size=64
        with tf.variable_scope("generator") as scope:
            # project `z` and reshape
            z= linear(z_, 64*8*4*4,'g_h0_lin')
            h0 = tf.nn.relu(batch_norm(tf.reshape(z, [-1, 4, 4, 64*8]),'g_bn0',train=False))
            h1 = deconv2d(h0, [batch_size, 8, 8, 64*4], name='g_h1')
            h1 = tf.nn.relu(batch_norm(h1,'g_bn1',train=False))
            h2 = deconv2d(h1, [batch_size, 16, 16, 64*2], name='g_h2')
            h2 = tf.nn.relu(batch_norm(h2,'g_bn2',train=False))
            h3 = deconv2d(h2, [batch_size, 32, 32, 64*1], name='g_h3')
            h3 = tf.nn.relu(batch_norm(h3,'g_bn3',train=False))
            h4 = deconv2d(h3, [batch_size, 64, 64, 3], name='g_h4')
        reuse = True
        return tf.nn.tanh(h4)  #shape=(batch_size, 64, 64, 3)
    return model

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

提示コード内容は把握・確認していませんが、エラー内容からほぼ同様のコードと思われる回答が見つかりました。
TensorFlow ValueError: Variable does not exist, or was not created with tf.get_variable()

以下のように修正することでエラーは発生しなくなるかもしれません

with tf.variable_scope(tf.get_variable_scope(),reuse=False):
    g_optim = tf.train.AdamOptimizer(~
    d_optim = tf.train.AdamOptimizer(~

もしかすると過去の以下の質問と同様の原因かもしれません。
解決もしているので同じ原因かご自身で確認ください。
tensorflowのエラーコマンドの解決方法について

ちなみに上記の回答にてTensorFlowの変数についての参考URLを示しているので、こちらも併せて確認ください。
TensorFlowの計算グラフ内の変数tf.Variableの使い方

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/20 16:08

    このサイトはすでに見て、試したのですが、同様のエラーが発生してしまいました。

    キャンセル

  • 2017/08/20 16:16

    エラーメッセージからは、そのような変数は存在しない あるいは tf.get_variable()で生成されていないのが
    原因としか分かりません。
    提示したコードにて、あなたはどのような変数を定義し、どのように使おうとしているのかを把握・ご理解されているでしょうか?それを追記すると回答が得られるかもしれません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る