2017-10-16 4 views
0

私はDCGANに基づいてGANに取り組んでいます。テンソルフローGAN、 'is_train = False'または 'opt.minimize(var_list = specific_vars)'?

GeneratorとDiscriminatorは、別のトレーニング中にGeneratorとDiscriminatorで変数をフリーズする必要があると聞きました。

私はこれまでにこうしました。

G    = generator(batch_size, z, in_h) 
D, D_logits = discriminator(X) 
D_, D_logits_ = discriminator(G, reuse=True) 

# Variable Grouping 
t_vars = tf.trainable_variables() 
d_var = [var for var in t_vars if 'discriminator' in var.name] 
g_var = [var for var in t_vars if 'generator' in var.name] 

op_D = tf.train.AdamOptimizer(learning_rate=learning_rate_D, 
          beta1=beta1).minimize(D_loss, var_list=d_var) 
op_G = tf.train.AdamOptimizer(learning_rate=learning_rate_G, 
          beta1=beta1).minimize(G_loss, var_list=g_var) 

そして、これはスコープのくぼみを無視してください、私のモデル

def generator(batch_size, z, im_size, is_train=True): 
with tf.variable_scope('generator', reuse=not is_train): 

    alpha = 0.2 
    #half_size, quat_size = im_size//2, im_size//4 

    x1 = tf.layers.dense(z, 4*4*1024) 

    x1 = tf.reshape(x1, (-1, 4, 4, 1024)) 
    x1 = tf.layers.batch_normalization(x1, training=is_train) 
    x1 = tf.maximum(alpha*x1, x1) # leaky relu 
    # 4*4*256 now 

    x2 = tf.layers.conv2d_transpose(x1, 512, 5, strides=2, padding='same') 
    x2 = tf.layers.batch_normalization(x2, training=is_train) 
    x2 = tf.maximum(alpha*x2, x2) 
    # 8*8*512 now 

    x3 = tf.layers.conv2d_transpose(x2, 256, 5, strides=2, padding='same') 
    x3 = tf.layers.batch_normalization(x3, training=is_train) 
    x3 = tf.maximum(alpha*x3, x3) 
    # 16*16*256 now 

    x4 = tf.layers.conv2d_transpose(x3, 128, 5, strides=2, padding='same') 
    x4 = tf.layers.batch_normalization(x4, training=is_train) 
    x4 = tf.maximum(alpha*x4, x4) 
    # 32*32*128 now 

    logits = tf.layers.conv2d_transpose(x4, in_ch, 5, strides=2, padding='same') 
    logits = tf.reshape(logits, (batch_size, im_size, im_size, in_ch)) 
    # 64*64*3 now 

    out = tf.tanh(logits) 

    return out 


def discriminator(image, reuse=False, is_train=True): 
with tf.variable_scope('discriminator', reuse=reuse): 

    alpha = 0.2 
    dr_rate = 0.3 
    #input 64*64*3 

    x1 = tf.layers.conv2d(image, 64, 5, strides=2, padding='same') 
    x1 = tf.maximum(alpha*x1, x1) 
    x1 = tf.layers.dropout(x1, rate=dr_rate, training=is_train) 
    # now 32*32*64 

    x2 = tf.layers.conv2d(x1, 128, 5, strides=2, padding='same') 
    x2 = tf.layers.batch_normalization(x2, training=is_train) 
    x2 = tf.maximum(alpha*x2, x2) 
    x2 = tf.layers.dropout(x2, rate=dr_rate, training=is_train) 
    # now 16*16*128 

    x3 = tf.layers.conv2d(x2, 256, 5, strides=2, padding='same') 
    x3 = tf.layers.batch_normalization(x3, training=is_train) 
    x3 = tf.maximum(alpha*x3, x3) 
    x3 = tf.layers.dropout(x3, rate=dr_rate, training=is_train) 
    # now 8*8*256 

    x4 = tf.layers.conv2d(x3, 512, 5, strides=2, padding='same') 
    x4 = tf.layers.batch_normalization(x4, training=is_train) 
    x4 = tf.maximum(alpha*x4, x4) 
    x4 = tf.layers.dropout(x4, rate=dr_rate, training=is_train) 
    # now 4*4*512 

    flat = tf.reshape(x4, (-1, 4*4*512)) 
    logits = tf.layers.dense(flat, 1) 
    out = tf.sigmoid(logits) 

    return out, logits 

です。

2番目のディスクリミネータのis_train = Falseを設定すると結果が変わります。

D_, D_logits_ = discriminator(G, reuse=True, is_train=False) 

このようにしてください。 is_train = Falseを変更した後、Gはうまく学習できないようです。

誰でも知っている理由は何ですか?私はこのコードがop_Gの間に 'g_var'を最適化するだけだと思います。

したがって、弁別者の 'is_train'を変更しても結果に影響を与えてはいけません。

答えて

1

GANが適切に動作するためには、ディスクリミネータの第2バージョンを学習可能にすることが不可欠です。ディスクリミネータがジェネレータの出力に基づいてウェイトを更新できない場合、リアルと偽物を区別することは決してないので、ジェネレータが学習するための意味のあるフィードバックは決して提供されません。 discriminatorの第2のコピーを訓練可能ではないように設定することによって、クラスの1つだけを表示することによって、2クラスの問題について分類子を訓練しようとしています。

参照のために、here TensorFlowのTFGANライブラリがジェネレータ/ディスクリミネータネットワークを設定する方法を参照してください。

関連する問題