06 Aug 2017, 07:36

PyTorchを初めて使ってみた!GANを実装

fast.ai Lesson10のテーマはGAN.

課題は、PyTorchで書かれたWGANを改善せよとのこと。さすがは、Cutting Edgeだ。GANもDCGANも通り越して、WGANに行ってしまう。

PyTorchもGANもよくわからない自分にはツライ。まずは、WGANの前にPyTorchとGANからはじめることにした。

まずは、GANの開祖である以下の論文に目を通した。

PyTorch first inpression

軽くPyTorchのチュートリアルと fast.aiの Jupyter Notebookを眺めたあと、PyTorchに挑戦!numpyを扱うみたいで書きやすい。

PyTouchの特徴は以下のようだ。

Kerasだと、簡単に書くために細かい部分はライブラリに覆い隠されているけれども、PyTorchは多少なりともむき出しになっているので、細かいカスタマイズがしやすそうない印象を受けた。Kerasと PyTorch、両方使えるようになりたい。

GANを実装してみる

GANの実装は、Kerasバージョンがfast.aiから提供されている。

これをPyTorchに置き換える。パラメータを参考にしつつ、また 公式の DCGANチュートリアルの実装も参考にしつつ、実装してみた。

ぜんぜんダメじゃん、ジェレミー先生!

これを mode collapse というらしい。

なんど試してみても、損失関数の D値が0に収束、G値が大きくなっている。

Dは Discriminaterを表し、GのGeneratorが生成したものが本物か偽物かを判定する役割があるのだが、今起こっている状況は、Generator が生成した画像がほとんどの確率で偽物と判定されている。

GANを改善してみる

How to Train a GANというNIPS2016での発表があって、ここにGANの改善方法がまとまっている。

[https://www.youtube.com/embed/X1mUN6dD8uE]

以下を試してみた。

  • ReLU の 代わりにLeakyReLUを使う。
  • BatchNormalizationを使う。
  • Adam の 学習率を小さくする。
  • ノイズは正規分布からサンプリングする。
  • ネットワークのニューロン数を変更する。

結果。

おっ、それらしく古代文字っぽいものが浮き出てきたぞ。

単純なGANだと、あまり成果がでないことはわかっているので、実験は早めに切り上げて次のステップ DCGANに進むことにする。

04 Aug 2017, 08:38

Real-Time(Fast) Style TransferでノートPCのWEBカメラからの動画にゴッホのスタイルをとらんすふぁー

fast.ai cutting-edge-dl-for-coders-part2の Lesson9の課題で、Fast Style Transferを実装した。

[https://www.youtube.com/embed/tEUtFeF4v8Q?ecver=1]

はじめに

前回の続きです。Lesson8ではStyle Transferを試した。

今回は、その続き。

Lesson9の課題は、Perceptual Losses for Real-Time Style Transferという論文を読んで理解し、Fast Style Transferを実装せよとのこと。

概要

前回のNeural Style Transferでは、学習に時間がかかることが問題だった。

この論文で書かれた手法をつかうと、学習したネットワークに画像を入力すると、順伝搬のみの計算でStyle Transferができる。GPUだと一瞬で(CPUだと一瞬じゃなかった)できる。なので、Real-Timeな画像処理=動画作成ができる。

これはすごい!

ネットワークの全体像は以下のような感じ。論文より引用。

Image Transform NetworkLoss Network の2つのネットワークを組み合わせる。

Image Transform Networkのアーキテクチャは、以下のサブドキュメントが詳しい。

Loss Networkは、VGG-16を用いる(全結合層をとったもの)。Content Loss と Style Lossを足しあわせ(これを Perceptual Lossと定義している)、損失関数とする。やっていることは、Lesson8のStyle Transferに似ている。

この損失関数を使って Image Transform Networkを 誤差逆伝播法で最適化する。Loss Networkは学習させない(公開済みの重みを使う)、Image Transform Networkのみ学習させる。

学習には、MS COCOという画像データを論文では利用していたが、Lesson9では、ImageNetからの抜粋画像(http://files.fast.ai/data/)を利用した。

ちょっと言葉足らずなので、詳しくは以下の記事を参考に。とても詳しく書いてあって参考になった。感謝。

結果

今回も、与えられたJupyter Notebookをコピペして作成。コードの意味が理解できていないという情けない状況。がんばろう

ノートPCの webcamから動画を取り込んで、fast style transfer で変換して、再度出力するということをやったが、ノートPCの非力なCPUでは、リアルタイムでは行かなかった。

02 Aug 2017, 04:34

Neural Style Transerで京都渡月橋の写真にゴッホのスタイルをとらんすふぁー

fast.ai Part2

fast.ai の Cutting Edge Deep Learning for Coders を始めた。

Lesson8のテーマは Artistic Transfer。いわゆる Style Transfer。絵のスタイルをディープラーニングで抽出して、別の画像に転移させるというもの。

Part1は Practical(実践) という題名だった。その意味するところは、Kagglerになれ というものだった。

Part2は、Cutting Edge(最先端)という題名だ。その意味するところがわかった。それは、論文を読め ということだった。Part2では、論文を読んでそれを実装するというのが課題として課せられるようだ。英語も数学もツライのに、論文なんて読んだことないから、無理だよ!!挫折しそう。

Neural Algorithm of Artistic Style

Lesson8では、アート系のディープラーニングの先駆けになった論文、A Neural Algorithm of Artistic Styleを読んで、再実装して、さらには結果をブログに書いてねという課題が出された。

というわけで、実装してみた。

元となるコードはちゃんと提供されている。それを写経しただけ。Keras版と PyTouch版がある。

理論の方は、素晴らしく解説された記事があるので、それを紹介。

コンテンツとスタイルの特徴抽出

このNeural Style Transferという方法は、異なる画像からコンテンツとスタイルを別々に特徴抽出して、それらを足しあわせて一枚の画像を生成する。

まずは、元となるコンテンツ画像。京都嵐山の渡月橋。去年旅行で行ってきた。

このコンテンツ画像からコンテンツの特徴を抽出したものが以下。

スタイル画像は、定番のゴッホの星月夜。

スタイルの特徴を抽出した画像が以下。

結果

そして最後に、コンテンツとスタイルを合成した画像が以下。

おまけ

こんなこともできる。