cedro-blog

SONY Neural Network Libraries で、学習済みモデルの推論実行をやってみる

こんにちは cedro です。

先回は、Neural Network Librariesサンプルプログラム DCGAN を改造して、顔画像生成の学習をさせました。

今回は、それに引き続き、いわゆる学習済みモデルの推論実行をやってみます。

クラス分類のプログラムであれば、推論実行は、新たなデータを見せて即座にどのクラスに属するのか判定させるという形になりますが、DCGANの場合は、どうなるのでしょうか。

その前に、DCGANの復習を簡単にしておきます。

 

これは DCGAN の模式図です。Generator は Noise を入力として、Discriminator本物と間違わせるような偽物を作成することを学習します。

一方、Discriminator は本物偽物を間違えないように学習します。この2つのネットワークが切磋琢磨することで高度な画像生成ができる様になります。

Generator はノイズから画像を作るという難しい作業をしているので、最初の頃は砂嵐の様な画像ばかりしか作れなくて、Discriminator はすぐ偽物だと分かっちゃう様な気もしますよね。

でも、最初は Discriminator も何も学習してませんから、砂嵐が来ようが、本物が来ようが分かりゃしません。そのうち、両者の切磋琢磨が始まる、というわけです。

ということで、DCGAN の推論実行は、ノイズを入力したら即座に偽画像を生成する、ということになります。

 

DCGAN プログラムを推論実行用に修正する

まず、サンプルプログラム DCGAN のプログラムの構成を見てみましょう。

1)import              >必要
2)generator のネットワーク定義  >必要
3)discriminator のネットワーク定義
4)GPU使用有無確認
5)generator のネットワーク構築  >一部必要
6)discriminator のネットワーク構築
7)Solver の設定
8)Monitor の設定         >一部必要
9)学習ループ
 ・データ(画像、ノイズ)読み込み        >一部必要
 ・generator の学習パラメータ更新、モニター出力 >一部必要
・discriminator の学習パラメータ更新、モニター出力
・generator, discriminator の学習パラメータセーブ(1000回に1回)

この中で、必要なのは、1)、2)、5)8)の一部、9)の一部。後は、不要です。一部必要な部分だけ、順に見て行きます。

 

generator のネットワーク構築部分です。ロス定義の部分は、不要ですね。

ということで、こんな形。nn.clear_parameters() でパラメーター領域を一端クリアして、ノイズ ZShape を定義し、fake = generator(z),  y = fake でネットワークを構築しています。

そして、nn.parameter.load_parameters( ” .\\ generator_param_020000.h5 ” ) で学習したパラメーターを読み込みます。

*先回、学習は4,000ステップで終了しましたが、さすがにちょっと物足りなかったので、再度20,000ステップ廻して、学習パラメーターを作り直しています。但し、そんなにクオリティは上がりませんでしたが。

 

monitor 部分です。fake image を保存する部分だけ残せば良いですね。

ということで、こんな形。monitor をインポートして、fake image を保存するディレクトリーを指定し、fake image の保存の仕方を設定します。毎回8×8(8×8=64)のタイル状で fake imageを保存する設定です。

 

Training loop 部分です。入力はプログラムの中で発生させるノイズだけなので、データの読み込みは不要です。また、定期的なパラメーターの保存も不要です。

ということで、こんな形。z.d = np.random.randn ( *z.shape ) でノイズを入力し、お約束の y.forward () で推論実行です。ループは40回廻すことにしています。

 

 Generator 関係のアップデート部分です。Solver は不要ですね。モニターの必要な部分のみ残します。

ということで、こんな形。

 

プログラム全体を載せておきます。

Generator のネットワーク定義の部分ですが、学習の時は2つのネットワークがあるので、with nn.parameter_scope(“gen”) とか書いてありましたが、この関連は削除しインデントを修正しています。

 

推論実行する

 

dcgan_replayというフォルダーを作成し、先程修正したプログラムを、dcgan_replay.py として保存します。後は、args.pygenerator_param_020000.h5 (学習パラメーターを保存したファイル)を入れます。

 

> cd dcgan_replay  でフォルダーへ移動し
> pyhton dcgan_replay.py  でプログラムを実行します。

学習パラメターを読み込んだら、次々に8×8のタイル画像を生成して行きます。また例によって画像生成の状況をGIF動画で見てみましょう。

 

画像生成が始まると、毎秒2~3枚のペース8×8のタイル画像を生成しており、このGIF動画は実際の画像生成とほぼ同じスピードです。さすがに、推論実行のスピードは速いですね。

 

画像生成のチューニング

 

これは推論実行で生成した生成画像の中の1枚です。入力が28×28ピクセルなので、全体のクオリティが低いのは許容するとして、まあまあ顔になっているものと、崩れてしまっているものが混在しています。この差は、どこから来るのでしょうか。

もうGenerator の学習パラメーターは固定されていますので、生成画像の質を左右するのは、ノイズ(100次元ベクトル)しかありません。

そうすると、100次元ベクトルの中には、まあまあの顔を生成するベクトルAと、崩れた顔を生成するベクトルBがあって、明らかに異なるものであると思われます。

そうであれば、上図の様な、ベクトル AーB を計算して、入力のノイズオフセットとして加えてやれば、画像生成が望ましい方向へ向かうチューニングができるはずです。

実際に、やってみましょう。

まず、画像の質100次元ベクトルの関係を調べるために、プログラムを修正します。

 

画像生成した時の100次元ベクトルを記録するために、Loop の所にプログラムを追加します。

CSVライブラリーを import し、書き込み用のCSVファイル( face.csv ) を準備します。

vector = np.ravel (z.d) で100個の1×1画像を100次元ベクトルに変換し、モニターに表示すると共に、CSVファイルに書き込みます。

後、バッチサイズ=1画像は1枚づつ表示(num_images=1)にし、64回ループを廻す設定にします。

dcgan_gen というフォルダーを作成し、修正したプログラムを dcgan_gen.py で保存します。

 

dcgan_gen フォルダーに移動し
> pyhon dcgan_gen.py でプログラムを実行します。

画面表示を見ると、生成画像 000000.png を保存した直後に、その時使われた100次元ベクトルが表示されています。この後、その100次元ベクトルCSVファイル( face.csv )に書き込みます。

これを64回繰り返します。

 

上図の様な感じで、生成した64枚の画像の中から、Good10枚Bad10枚選びます。

 

OpenOfficeCalc を使って、該当する100次元ベクトル各列を平均し、Goodベクトルの平均Badベクトルの平均を求め、Good ーBadオフセット値を求めます。

オフセット値は、offset.csv ファイル(1行×100列)に書き込んで置きます。。

 

100次元ベクトルオフセット値を加えるためにプログラムを修正します。

read_fp = csv.reader ( open( “offset.csv”,”r” )) で、offset.csvからの読み込みの準備をし、for line in read_fp:で1行データを読み込みます。

読み込んだデータは文字列なのでline = list ( map (float, line ))数値に変換し、offset = np.reshape( line,[100,1,1] )100個の1×1画像に戻します。後は、z.d = np.random.randn (*z.shape) + offset でノイズにオフセット値を加えています。

生成画像を8×8に戻して、再度画像生成を行い、改善前と比較してみます。

 

左がオフセットを加える前、右がオフセットを加えた後生成画像です。オフセットを加えることによって、とんでもない画像が減って、生成画像が望ましい方向に安定することが分かります。

この考え方を一般化すると、ある特徴量(例えば、髪の長さ、目の大きさ、鼻の高さ、顔の形など)に着目した時、その特徴量が大きくなるベクトル小さくなるベクトルを見つけることができれば、その特徴量をコントロールできることが分かります。

うーん、DCGAN、なかなか奥の深いネットワークのようです。機会があれば、また色々触ってみたいです。

では、また。

 

PS 旦那、Windows7でも動きますぜ

SONY Neural Network Console を使ってみたいけど、Windows 7だからダメだとお嘆きの貴兄に。

6年前に買った私の MacbookAir は、boot champWindows 7しか対応不可。しかし、試しにやってみたら、動きました。もちろん、Neural Network LibrariesOKでした。

ちなみに、今回20,000ステップ廻して、学習パラメーターを作り直したのは、Windows7Neural Network Libraries です。

騙されたと思って、一度インストールしてみてはいかがでしょうか。

動くかもよ