前提・実現したいこと
何度も質問内容を変更して申し訳ありません。
皆様こんにちは。Tensorflow 2.0(Keras)のチュートリアルを参考にして画像生成を試みています。
256 * 256のRGB画像でのDCGANで画像生成をしていますが、Trainingしてもほとんど更新されず、16種類画像を表示しても同じ画像ばかり現れて新しい画像が生成できません。
https://www.tensorflow.org/tutorials/generative/dcgan?hl=ja のMNISTのGANを参考にしています。この場合、出力層などを変えながらciferAの画像(ただし入出力画像の出力チャンネルを3にした)を学習することができたため、原因が分かりません。
問題があるところは、モデルと画像表示の部分だと思うのですが、その部分だけのコードだけで解決できるでしょうか。
コードが十分でなかった場合は追記いたします。よろしくおねがいします。
GeneratorとDiscriminatorだけですが、この論文の実装をイメージしています。
https://www.researchgate.net/publication/331200586_Bidirectional_Face_Aging_Synthesis_Based_on_Improved_Deep_Convolutional_Generative_Adversarial_Networks
また、これはこの状況を再現するための実装のJupyter Notebookです。
https://colab.research.google.com/drive/1qH-gMq_MYq2J-yIsE5IngWixp9wvzrQ9?hl=ja#scrollTo=XRfxGOW3Oybz
(モデル更新後)
もしかしたらエポック数が足りないのかもしれないため、更に試してみます。
#Generator(変更前)
python
1def make_generator_model(): 2 model = tf.keras.Sequential() 3 model.add(layers.Dense(4*4*1024, input_shape=(100,))) 4 model.add(layers.ReLU()) 5 6 model.add(layers.Reshape((4, 4, 1024))) 7 model.add(layers.Conv2DTranspose(1024, (5, 5), strides=(1, 1), padding='same', use_bias=False,activation='relu',kernel_initializer='random_normal')) 8 assert model.output_shape == (None, 4, 4, 1024) 9 10 model.add(layers.Conv2DTranspose(512, (5, 5), strides=(2, 2), padding='same')) 11 model.add(layers.ReLU()) 12 13 model.add(layers.Conv2DTranspose(256, (5, 5), strides=(2, 2), padding='same')) 14 model.add(layers.ReLU()) 15 16 17 model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same')) 18 model.add(layers.ReLU()) 19 20 model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same')) 21 model.add(layers.ReLU()) 22 23 model.add(layers.Conv2DTranspose(32, (5, 5), strides=(2, 2), padding='same')) 24 model.add(layers.ReLU()) 25 assert model.output_shape == (None, 128, 128, 32) 26 27 model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same')) 28 model.add(Activation('tanh')) 29 assert model.output_shape == (None, 256, 256, 3) 30 31 return model 32 33generator = make_generator_model() 34 35noise = tf.random.normal([1, 100]) 36generated_image = generator(noise, training=False) 37generated_image[0] 38 39plt.imshow(tf.cast((generated_image[0, :, :, :] + 1.0 ) * 127.5,'uint8')) #matlotlibです
#Discriminator(変更前)
python
1def make_discriminator_model(): 2 model = tf.keras.Sequential() 3 model.add(layers.Conv2D(16, (5, 5), strides=(2, 2), padding='same', 4 input_shape=[256, 256, 3])) 5 model.add(layers.LeakyReLU()) 6 model.add(layers.BatchNormalization()) 7 8 model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), padding='same')) 9 model.add(layers.LeakyReLU()) 10 model.add(layers.BatchNormalization()) 11 12 model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same')) 13 model.add(layers.LeakyReLU()) 14 model.add(layers.BatchNormalization()) 15 16 model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same')) 17 model.add(layers.LeakyReLU()) 18 model.add(layers.BatchNormalization()) 19 20 model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same')) 21 model.add(layers.LeakyReLU()) 22 model.add(layers.BatchNormalization()) 23 24 model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same')) 25 model.add(layers.LeakyReLU()) 26 model.add(layers.BatchNormalization()) 27 28 model.add(layers.Flatten()) 29 model.add(layers.Dense(1024)) 30 model.add(layers.LeakyReLU()) 31 model.add(Activation('relu')) 32 33 34 model.add(layers.Dense(1)) 35 model.add(Activation('sigmoid')) 36 37 return model
#Generator(変更前)
python
1def make_generator_model(): 2 model = tf.keras.Sequential() 3 model.add(layers.Dense(32*32*3, use_bias=False, input_shape=(100,))) 4 model.add(layers.LeakyReLU()) 5 6 model.add(layers.Reshape((32, 32, 3))) 7 assert model.output_shape == (None, 32, 32, 3) # Note: None is the batch size 8 9 model.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same', use_bias=False,kernel_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.2))) 10 assert model.output_shape == (None, 64, 64, 32) 11 model.add(layers.BatchNormalization()) 12 model.add(layers.LeakyReLU()) 13 14 model.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', use_bias=False,kernel_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.2))) 15 assert model.output_shape == (None, 128, 128, 64) 16 model.add(layers.BatchNormalization()) 17 model.add(layers.LeakyReLU()) 18 19 model.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', use_bias=False, activation='tanh')) 20 assert model.output_shape == (None, 256, 256, 3) 21 22 return model 23 24noise = tf.random.normal([1, 100]) 25generated_image = generator(noise, training=False) 26generated_image[0] 27 28plt.imshow(tf.cast((generated_image[0, :, :, :] + 1.0 ) * 127.5,'uint32')) #matlotlibです
#Discriminator(変更後)
python
1def make_discriminator_model(): 2 model = tf.keras.Sequential() 3 model.add(layers.Conv2D(16,(5, 5), strides=(2, 2), padding='same', 4 input_shape=[256, 256, 3])) 5 model.add(layers.LeakyReLU()) 6 7 model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), padding='same')) 8 model.add(layers.LeakyReLU()) 9 10 model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same')) 11 model.add(layers.LeakyReLU()) 12 13 model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same')) 14 model.add(layers.LeakyReLU()) 15 16 model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same')) 17 model.add(layers.LeakyReLU()) 18 19 model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same')) 20 model.add(layers.LeakyReLU()) 21 22 model.add(layers.Dense(1024)) 23 model.add(layers.LeakyReLU()) 24 25 model.add(layers.Flatten()) 26 27 model.add(layers.Dense(1)) 28 # model.add(Activation('sigmoid')) 29 30 return model
こちらは、先述の公式MNIST実装のコードをほとんどコピーした、カラー画像が表示できるはずのコードですが、ほとんど同じようなほぼ一色の画像が表示されます。
python
1def generate_and_save_images(model, epoch, test_input): 2 # Notice `training` is set to False. 3 # This is so all layers run in inference mode (batchnorm). 4 predictions = model(test_input, training=False) 5 6 fig = plt.figure(figsize=(4,4)) 7 8 for i in range(predictions.shape[0]): 9 plt.subplot(4, 4, i+1) 10 plt.imshow(tf.cast((predictions[i] + 1 ) * 0.5 ,dtype='float32')) 11 plt.axis('off') 12 13 plt.savefig('image_at_epoch_{:04d}.png'.format(epoch)) 14 plt.show()
試したこと
重みの初期値の変更、Generatorの出力のバイアスのあり・なしの変更、
kernel_initializer='random_normal'、Discriminatorの変更
補足情報(FW/ツールのバージョンなど)
tensorflow2.0とKeras、ColaboratoryのGPUで実行しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/26 13:08