私はテンソルフローに少し慣れていないので、問題が明らかな場合はご容赦ください。基本的に、私は敵対的生成ネットワークを作成しており、ジェネレーターは非常に反復的なタイルのようなパターンを生成します。現時点では、私の発電機モデルは次のようになっています
def generator(input):
net = dense_block(input, 1024*4*4, "dense-1")
net = tf.reshape(net, [-1,4,4,1024])
net = tf.nn.relu(tf.layers.batch_normalization(net, name="bn1"))
print ("Dense 1", net.get_shape())
net = deconv_block(net, 512, [5,5], [1,2,2,1], "SAME", "deconv1")
net = tf.layers.batch_normalization(net, name="bn2")
net = tf.nn.relu(net)
print ("deconv 1", net.get_shape())
net = deconv_block(net, 256, [5,5], [1,2,2,1], "SAME", "deconv2")
net = tf.layers.batch_normalization(net, name="bn3")
net = tf.nn.relu(net)
print ("deconv 2", net.get_shape())
net = deconv_block(net, 128, [5,5], [1,2,2,1], "SAME", "deconv3")
net = tf.layers.batch_normalization(net, name="bn4")
net = tf.nn.relu(net)
print ("deconv 3", net.get_shape())
net = deconv_block(net, channels, [5,5], [1,2,2,1], "SAME", "deconv4")
net = tf.layers.batch_normalization(net, name="bn5")
net = tf.nn.tanh(net)
return net
高密度ブロックは次のもので構成されます。
def dense_block(net, out_dim, name):
w = init_weights([net.get_shape().as_list()[-1], out_dim], name=name+"-weights")
b = init_biases(out_dim, name=name+"-biases")
dense = tf.matmul(net, w) + b
return dense
deconv ブロックは次のようになります。
def deconv_block(net, filter_num, kernel_size, stride_size, padding, name):
shape = [kernel_size[1], kernel_size[0], filter_num, net.get_shape().as_list()[-1]]
in_shape = net.get_shape().as_list()
w = init_weights(shape, name)
b = init_biases(filter_num, name)
out_shape=[in_shape[0], in_shape[2]*2, in_shape[1]*2, filter_num]
deconv = tf.nn.conv2d_transpose(value=net, filter=w, strides=stride_size, output_shape=out_shape, padding=padding, name=name)
deconv = tf.reshape(tf.nn.bias_add(deconv, b), deconv.get_shape())
return deconv
重みとバイアスの作成は次のとおりです。
def init_weights(shape, name):
return tf.get_variable(initializer=tf.truncated_normal(shape, stddev=0.05), name=name+"-weights")
def init_biases(length, name):
return tf.get_variable(initializer=tf.constant(0.05, shape=[length]), name=name+"-biases")
損失関数とオプティマイザは次のとおりです。
g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_net2, labels=tf.ones_like(D_net2)))
g_opt = tf.train.AdamOptimizer().minimize(loss=g_loss, var_list=g_params)
で定義されているように、グラフ「G」のすべてのパラメーターをトレーニングしています。
g_params = [v for v in vars if v.name.startswith('G/')]
これは正しい数の変数を返すようです。ネットワークには、サイズ (batch_size、100) のテンソルが供給されます。これは、拡大された mnist データ (64x64 に拡大) に似ているはずです。エラーから気付いたのは、ジェネレーターは、いくつかのエポックとフラットラインの損失に関してのみ改善されるということです。ディスクリミネーターが 50 エポックごとにしか更新されない場合でも、ジェネレーターは約 150 エポック後に改善されません。
出力例は次のようになります: Epoch 500
また、弁別器が正しく機能することにも注意してください。mnist の分類 CNN であるディスクリミネータから始めて、GAN で使用するために、基本的にすべての出力を 1 つのノードにマージしました。
他の出力も同様のタイリング パターンに従いますが、その理由はわかりません。誰かがそれを助けることができれば、それは素晴らしいことです! さらに情報が必要な場合は、お知らせください。