コードの解説
(2)もお読み頂きありがとうございます。
それでは、さっそく、コードの解説に移らせていただきたいと思います。まずはganの仕組みをしっかり理解する必要があります。原論文をきちんと読んだ上で、実装に即した形で説明したいと思います。
GANの実装の仕組み
基本の構成要素
GANは、2つのニューラルネットワークでできています。
generaterとdescriminaterです。面倒なので、g,dと呼びます。gは、ニセの画像を作り出すニューラルネットワークです。dは、gが作ったニセの画像と、本物の画像を識別するニューラルネットワークです。
なので、gが偽造者、dが判別者などと呼ばれたりもします。
gとdをトレーニングしていくと、最終的には、本物っぽい画像を生み出すgが得られることになります。このgを使えば、以後、本物っぽい画像をいくらでも生成できることになります。
###gとdの実装理念
gは、ノイズの入力に対してニセ画像を出力するニューラルネットワークです。
ノイズは、サイズが(n×1)で、各要素が標準正規分布から発生させた乱数になっているnumpyndarrayです。
ニセ画像は、サイズが(row×columun×3)で、各要素は−1から1の範囲に収まるnumpyndarrayです。
g(ノイズ)=ニセ画像
ですね。
dは、画像の入力に対して本物かどうかを出力するニューラルネットワークです。
画像は、ニセ画像または真の画像です。真の画像は、サイズがニセ画像と同じで、実際の写真等をndarrayに変換したものです。ただし、各要素は255で割り算して−1されているので、範囲は−1から1になります。出力は、0から1のスカラーで、ニセ画像に対しては0,真の画像に対しては1を出力するようにトレーニングされます。
d(画像)=0〜1ですね
学習のやり方
ここが、元の論文以外でなかなか説明されていない部分です。
学習は2ステップの組み合わせになります。
1ステップ目は、gのパラメタを固定してdのパラメタだけを鍛えます。つまり、真の画像の入力には1を、ニセ画像=g(ノイズ)の入力には1を返すように、dだけをトレーニングします。
2ステップ目は、dのパラメタを固定してgのパラメタだけを鍛えます。この際、gとdを組み合わせたモデルを作って、トレーニングします。組み合わせたモデルは、
d(g(noise))
ですね。その出力が1になるようにgのパラメタだけを鍛えます。
各エポックごとに、このステップ1と2を繰り返していくのです。これがポイントです。敵対的生成モデルとは言うものの、gとdを同時に鍛えるのではなく、交互に鍛えるんですね。ですから、実装がカンタンに済むのです。
説明が長くなってしまったので、コードの解説は次回行いたいと思います。お読み頂き、ありがとうございました。