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)の最初の部分が2番目のコードブロック(= 2番目のコードブロック) 。結論:ジェネレータ2 +弁別器1 - >大丈夫。ジェネレータ1 +ディスクリミネータ2 - >いいえ!だから私はdiscriminator 2に何か問題があると思いますか? –
@JeroenBertels 'tf.layers.dropout'にはデフォルトで' training = False'というパラメータがあり、あなたの場合はドロップアウトを使用しません。それが問題なのだろうかと思います。 'tf.nn.dropout'で' training_prob'を別の 'keep_prob'を使って適切に訓練と推論をしているのであれば、弁別子1は通常、弁別子2よりも頑強です。 –