【DeepLearning】Patch GANのPatchとは?
今回は様々なGANの中に出没するPatchGANについて
Patch GAN とは
pix2pixや先日の記事で紹介したAttention GANなどにもDiscriminatorとしてPatch GANがよく出てきます。
そこで、Patch GANとググるとよくこのように紹介されています。
Discriminator(Patch GAN) への入力は、生成された画像全体ではなく少領域(patch)を切り出したものであり、各patchでの誤差を平均を取ります
なるほど、全体からいきなり一つの結果(真偽)を求めるより、小さな領域での結果から全体の結果を求めるアプローチは直感的にも良さそうですね。
Patchは何処へ...
やりたいことは何となく理解できました。 そこで実装を見てみようと言うことで、
pix2pixの実装をいくつかのぞいてみました。
すると何ということでしょう、patchを切り出したり、ストライドするような処理が見当たりません。
Discriminatorの最終出力はあるサイズ(入力画像の 分の1)をもった特徴マップになっています。
Patch = Receptive Field
そう悩んでいるとすでに同じような疑問を持った人が質問していてくれていました。
Question: PatchGAN Discriminator · Issue #39 · junyanz/pytorch-CycleGAN-and-pix2pix · GitHub
Q: And looks like discriminator you've implemented is just a conv net, not a patchgan that was mentioned in the paper.
A: Which is patch ij in the input? Well, output X_ij is just a neuron in a convnet, and we can trace back its receptive field to see which input pixels it is sensitive to.
つまりどういうことかと言うと、CNNを畳み込んで得られる特徴マップのある1pixelは、入力画像のある領域(Receptive field)の影響を受けた値になります。
裏を返せば、ある1pixelに影響を与えられるのは、入力画像のある領域だけです。
そのため、「最終出力をあるサイズをもった特徴マップにして、各pixelにて真偽判定をする」ことと 、「入力画像をpatchにして、各patchの出力で真偽判定をする」ということが等価になります。
まとめ
Patch GANでは説明の簡単のためには、patchを切り出して入力とするということで間違いありませんが、実際には画像全体を入力とし、実効的なReceptive fieldをpatchとして扱います。(もちろん本当にpatchを切り出して処理しても問題はないでしょうが、計算効率的にどちらが良いかは火を見るより明らかですね)
そのため、Patch GANを実装する際には実効的なReceptive fieldがどの程度の大きさであるかを把握するのが大事になります。
ちなみにその大きさを計算するには、こちらあたりが参考になるかと思います。
問題の種類によってReceptive fieldの値をきちんとデザインする必要がありそうですね。
例えば、画像全体の変換をするような問題(夏→冬など)は大局的な視点が必要になるでしょうし、画像の中のある領域だけを変換したい場合(馬→シマウマなど)は局所的な視点の方が重要になりそうな気がします。
暇があれば一度試してみたいものですね。