2017-12-20 2 views
0

私のコードは一般的な部分(図示せず)と可変部分(コードのブロックを参照)で構成されています。次のブロックを使用する場合はすべてがうまく機能:tf.layersでの作業とtf.get_variableでの指定との間のTensorflowの相違

def generator(x, reuse=False): 
    with tf.variable_scope('generator', reuse=reuse): 
     # initializers 
     w_init = tf.truncated_normal_initializer(mean=0, stddev=0.02) 
     b_init = tf.constant_initializer(0.) 
     # 1st hidden layer 
     w0 = tf.get_variable('G_w0', [x.get_shape()[1], 256], initializer=w_init) 
     b0 = tf.get_variable('G_b0', [256], initializer=b_init) 
     h0 = tf.nn.relu(tf.matmul(x, w0) + b0) 
     # 2nd hidden layer 
     w1 = tf.get_variable('G_w1', [h0.get_shape()[1], 512], initializer=w_init) 
     b1 = tf.get_variable('G_b1', [512], initializer=b_init) 
     h1 = tf.nn.relu(tf.matmul(h0, w1) + b1) 
     # 3rd hidden layer 
     w2 = tf.get_variable('G_w2', [h1.get_shape()[1], 1024], initializer=w_init) 
     b2 = tf.get_variable('G_b2', [1024], initializer=b_init) 
     h2 = tf.nn.relu(tf.matmul(h1, w2) + b2) 
     # output hidden layer 
     w3 = tf.get_variable('G_w3', [h2.get_shape()[1], 784], initializer=w_init) 
     b3 = tf.get_variable('G_b3', [784], initializer=b_init) 
     o = tf.nn.tanh(tf.matmul(h2, w3) + b3) 
    return o 

def discriminator(x, drop_out, reuse=False): 
    with tf.variable_scope('discriminator', reuse=reuse): 
     x = tf.reshape(x, [-1, 784]) 
     # initializers 
     w_init = tf.truncated_normal_initializer(mean=0, stddev=0.02) 
     b_init = tf.constant_initializer(0.) 
     # 1st hidden layer 
     w0 = tf.get_variable('D_w0', [x.get_shape()[1], 1024], initializer=w_init) 
     b0 = tf.get_variable('D_b0', [1024], initializer=b_init) 
     h0 = tf.nn.relu(tf.matmul(x, w0) + b0) 
     h0 = tf.nn.dropout(h0, 1-drop_out) 
     # 2nd hidden layer 
     w1 = tf.get_variable('D_w1', [h0.get_shape()[1], 512], initializer=w_init) 
     b1 = tf.get_variable('D_b1', [512], initializer=b_init) 
     h1 = tf.nn.relu(tf.matmul(h0, w1) + b1) 
     h1 = tf.nn.dropout(h1, 1-drop_out) 
    # 3rd hidden layer 
     w2 = tf.get_variable('D_w2', [h1.get_shape()[1], 256], initializer=w_init) 
     b2 = tf.get_variable('D_b2', [256], initializer=b_init) 
     h2 = tf.nn.relu(tf.matmul(h1, w2) + b2) 
     h2 = tf.nn.dropout(h2, 1-drop_out) 
    # output layer 
     w3 = tf.get_variable('D_w3', [h2.get_shape()[1], 1], initializer=w_init) 
     b3 = tf.get_variable('D_b3', [1], initializer=b_init) 
     o = tf.sigmoid(tf.matmul(h2, w3) + b3) 
    return o 

次のブロックは(右、前のブロックとまったく同じことを行うべきか?)を使用した場合の訓練はもう動作しません:

def generator(x, reuse=False): 
    with tf.variable_scope('generator', reuse=reuse): 
     w_init = tf.truncated_normal_initializer(0., 0.02) 
     b_init = tf.constant_initializer(0.) 
     l1 = tf.layers.dense(x, 256, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu) 
     l2 = tf.layers.dense(l1, 512, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu) 
     l3 = tf.layers.dense(l2, 1024, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu) 
     o = tf.layers.dense(l3, 784, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.tanh) 
    return o 

def discriminator(x, drop_out, reuse=False): 
    with tf.variable_scope('discriminator', reuse=reuse): 
     x = tf.reshape(x, [-1, 784]) 
     w_init = tf.truncated_normal_initializer(0., 0.02) 
     b_init = tf.constant_initializer(0.) 
     l1 = tf.layers.dense(x, 1024, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu) 
     l1_ = tf.layers.dropout(l1, drop_out) 
     l2 = tf.layers.dense(l1_, 512, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu) 
     l2_ = tf.layers.dropout(l2, drop_out) 
     l3 = tf.layers.dense(l2_, 256, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu) 
     l3_ = tf.layers.dropout(l3, drop_out) 
     o = tf.layers.dense(l3_, 1, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.sigmoid) 
    return o 

私は違いがどこにあるのか分かりませんが、そこに作成された画像を学習して見ていると、違いがあります。最初のブロックは常に完全に機能します。 2回目はほんの数回繰り返します。

ありがとうございました!

答えて

1

私はコメントできません。tf.nn.dropoutkeep_probを使用し、ドロップ率はtf.layers.dropoutを使用しています。このレートが高すぎるかどうかを確認してください。

+0

これは本当に良い点です!しかし、それはここで明らかに問題ではありません... –

+0

そして、最初のコードブロック(=ジェネレータ1)の最初の部分が2番目のコードブロック(= 2番目のコードブロック) 。結論:ジェネレータ2 +弁別器1 - >大丈夫。ジェネレータ1 +ディスクリミネータ2 - >いいえ!だから私はdiscriminator 2に何か問題があると思いますか? –

+1

@JeroenBertels 'tf.layers.dropout'にはデフォルトで' training = False'というパラメータがあり、あなたの場合はドロップアウトを使用しません。それが問題なのだろうかと思います。 'tf.nn.dropout'で' training_prob'を別の 'keep_prob'を使って適切に訓練と推論をしているのであれば、弁別子1は通常、弁別子2よりも頑強です。 –

関連する問題