tensorfow2.3.0でGANを作成しています。作成中に原因不明の現象に遭遇し、行き詰っています。
一行目はtf2.3のBatchNormについての記事をみて追加しました。が、今回の問題には関係ないようです。
###コード
Python
1BatchNormalization = tf.compat.v1.keras.layers.BatchNormalization 2def build_discriminator(input_shape): 3 input_ = Input(shape=input_shape) 4 5 a = Conv2D(32,kernel_size=4,strides=2,padding="same",activation="relu")(input_) 6 #1↓ 7 a = Conv2D(64,kernel_size=4,strides=2,padding="same")(a) 8 a = BatchNormalization()(a) 9 a = Activation("relu")(a) 10 #2↓ 11 a = Conv2D(128,kernel_size=4,strides=2,padding="same")(a) 12 a = BatchNormalization()(a) 13 a = Activation("relu")(a) 14 #3↓ 15 a = Conv2D(8,kernel_size=3)(a) 16 a = BatchNormalization()(a) 17 a = Activation("relu")(a) 18 19 a = Flatten()(a) 20 out = Dense(1,activation="sigmoid")(a) 21 22 return Model(input_,out) 23 24#compile時 25discriminator.compile(loss="mae",optimizer=Adam(0.0002,0.5)) 26discriminator.trainable = False 27comb_model = Model(generator.input,discriminator(generator.output)) 28comb_model.compile(loss="mae",optimizer=Adam(0.0002,0.5)) 29 30#訓練時 31feedback_dr = discriminator.train_on_batch(imgs,ones) 32feedback_df = discriminator.train_on_batch(imgs_fake,zeros) 33#原因特定のため、generatorの学習はしておらず、imgs_fakeを生成するためのみに使用しています。
###症状
この状態で学習すると、Dがimgs_fakeに対し1を出力するように学習し、lossも1が目標値として計算されています。
また、onesを任意の値に変更すると、imgsとimgs_fakeに対してその値を吐くようになるため、imgs学習時に目標値として渡した値がimgs_fake学習時にも使用されているようです。
imgs_fakeとimgsの学習の順番を入れ替え、imgs_fakeを先に学習しても、imgsの目標値にimgs_fakeが引っ張られます。
何が原因か検証したのですが、私の頭では分かりませんでした;;
###検証
正常(imgs=1,imgs_fake=0に向かう)
異常(imgs=1,imgs_fake=1に向かう)
・全てのBatchNormalizationをコメントアウト(正常)
・(#1#2)のBatchNormalizationの両方をコメントアウト(正常)
・(#1#2)のBatchNormalizationの片方をコメントアウト(異常)
padding="same"後かstrides後のBatchNormalizationがダメか?
Python
1 input_ = Input(shape=input_shape) 2 3 a = Conv2D(32,kernel_size=4,strides=2,padding="same",activation="relu")(input_) 4 a = Conv2D(64,kernel_size=4,strides=2,padding="same")(a) 5 #a = BatchNormalization()(a) 6 a = Activation("relu")(a) 7 a = Conv2D(128,kernel_size=4,strides=2,padding="same")(a) 8 #a = BatchNormalization()(a) 9 a = Activation("relu")(a) 10 11 a = Conv2D(8,kernel_size=4,strides=2,padding="same")(a)#strides,paddingを追加 12 a = BatchNormalization()(a) 13 a = Activation("relu")(a) 14 a = Flatten()(a) 15 out = Dense(1,activation="sigmoid")(a) 16 17 return Model(input_,out) 18```↑正常。strides,paddingは関係なさそう。 19 20 21・(#1#2)の両ブロックをコメントアウト(異常) 22・(#1#2)の片ブロックをコメントアウト(異常) 23・(#1#2)の片ブロックをコメントアウトかつ他方のBatchNormをコメントアウト(異常) 24 25```Python 26def reflect_padding(tensor,paddings): 27 return tf.pad(tensor,[(x,x) for x in paddings],"REFLECT") 28 29input_ = Input(shape=input_shape) 30 31a = Conv2D(32,kernel_size=4,strides=2,activation="relu")(reflect_padding(input_,(0,1,1,0))) 32a = Conv2D(64,kernel_size=4,strides=2)(reflect_padding(a,(0,1,1,0))) 33#a = BatchNormalization()(a) 34a = Activation("relu")(a) 35a = Conv2D(128,kernel_size=4,strides=2)(reflect_padding(a,(0,1,1,0))) 36#a = BatchNormalization()(a) 37a = Activation("relu")(a) 38 39a = Conv2D(8,kernel_size=3)(a) 40a = BatchNormalization()(a) 41a = Activation("relu")(a) 42a = Flatten()(a) 43out = Dense(1,activation="sigmoid")(a) 44 45return Model(input_,out) 46```↑異常。padding="same"からtf.padを挿入に変更しただけで異常になりました。レイヤー数などが影響しているかもしれません。上記のコードでもBatchNormをコメントアウトすると正常になるので、BatchNormは関係してそうです。 47 48・(#1#2)のBatchNormalizationの両方をコメントアウト+Convのpaddingを全てvalidに(異常)。paddingを変更しただけで異常になりました。 49 50 51何か分かったことがあれば追記していきます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。