Re:ゼロから始めるML生活

機械学習ド素人が、流行に乗ってニューラルネットとか勉強してみるブログ

TensorBoardを使ってみた

今回はTensorFlowのライブラリに付属しているTensorBoardなるものを使って色々可視化してみたいと思います。

参考にさせていただいたのはこちらです。

deepage.net

TensorBoard

TensorFlowにはTensorBoardという付属のツールがあって、こいつを使えるのがTensorFlowの結構大きなポイントだったりします。

TensorBoardではTensorFlowでの実行時に発生するデータを可視化・表現できます。 可視化できるものとして代表的なものはこんな感じらしいです。

使い方

TensorBoardでは、可視化したいデータや形式をプログラム中に明示的に指定することで、 TensorBoardが表示するための情報を裏で取得してくれるみたいです。

手順

そもそも動くTensorFlowを使用したコードがある状態から考えると、手順としてはこんな感じでしょうか。

  1. プログラム中に可視化用のコードを追加
  2. 普通にプログラムを実行
  3. TensorBoardを起動
  4. ブラウザからTensorBoardを開く

具体例

今回は試しにこの前使用したコードを使用してやってみます。

tsunotsuno.hatenablog.com

1. プログラム中に可視化用のコードを追加

使うためには、上のコードにちょびっと追加します。

# TensorBoardで追跡する変数を定義                                                                                                                               
with tf.name_scope('summary'):
    tf.summary.scalar('loss', cross_entropy)
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs', sess.graph)

2. 普通にプログラムを実行

特に何も考えずに普通に実行してください。

python3 main.py

普通に実行します。 すると、カレントディレクトリにlogというディレクトリができているかと思います。 これができていれば、とりあえず問題なく動いていそうです。

3. TensorBoardを起動

実行が完了したら、TensorFlowを起動します。 TensorBoardは次のコマンドで起動します。

tensorboard --logdir=./logs

4. ブラウザからTensorBoardを開く

コンソールに出ているURLをブラウザに放り込めばTensorBoardを確認する事ができます。 きちんとTensorFlowが起動できていれば下のurlをで可視化結果が開きます。

http://localhost:6006/

f:id:nogawanogawa:20180131203555p:plain

Google Cloud Platformの導入メモ

この前はGoogle Colabを使って見たんですが、どうやらGANをやるには不向きな感じでした。

tsunotsuno.hatenablog.com

こうなったら、やはり本家だろうということでGoogle Cloud Platform (GCP)を使って機械学習をやる方法を調べてみました。

参考にさせていただいたのはこちら。

qiita.com

Google Cloud Platform (GCP)

登録

何はともあれ登録。

cloud.google.com

料金

無料トライアルで始めの1年は$300分使えるみたいです。 (2018年5月3日現在)

f:id:nogawanogawa:20180503223011j:plain

その他の料金はこちら。

cloud.google.com

クラウド使うのが初めてなので、どれ使えばいいとかイマイチわかりません。 参考サイトでも言われていますが、すぐに$300使い切ることはまず無いので、一旦使ってみてからサービスは考えることにしたほうが良さそうです。

チュートリアル(途中まで)

Google公式の説明書はこちら。

(英語)https://cloud.google.com/ml-engine/docs/tensorflow/getting-started-training-prediction?hl=ja

(日本語)https://cloud.google.com/ml-engine/docs/getting-started-training-prediction

どうやら、CLOUD SHELLを使うほうがお手軽らしいので、今回はそちらでやってみました。

"TensorBoard を使用した要約ログの検査"までやってみましたが、書いてあるとおりにコマンドをコピペしていけばいけました。

f:id:nogawanogawa:20180504100030p:plain

f:id:nogawanogawa:20180504100039p:plain

あとはコードを手元のコードを吸い上げれば普通に実行できそうです。

まとめ

GCPチュートリアルレベルであれば結構簡単に動きました。 クラウドとのファイル転送やらGPUの使い方やらは勉強しないといけませんが、ひとまず環境が使えることを確認できてよかったです。

Google Colabを使ってみた

f:id:nogawanogawa:20180503144836p:plain

ちょっと前にこんなブログが話題になってました。

karaage.hatenadiary.jp

無料でクラウドGPUを使える日がついに来たようです。 機会学習を始めたころから、すごーく使いたかったんです。 というわけで、使ってみました。

Google Colabとは

こちらの記事が大変参考になりました。

www.codexa.net

要は、Notebook形式で機械学習プログラムをお手軽に実装できる環境ということですね。 Notebook形式はJupiter notebookがあるので、機械学習屋さんには慣れ親しんだ環境がクラウドになったイメージでしょうか。

使い方

google colabへアクセス

URLはこちら。 https://colab.research.google.com/

こんな画面が出てくるかと思います。 f:id:nogawanogawa:20180503140640p:plain

右上のログインからgoogle アカウントを使用してログインしてください。

ノートブックの作成

左上のファイルから

f:id:nogawanogawa:20180503140249p:plain

ファイル>Python3のノートブックを新規作成

するとこんな感じのノートブックができます。 f:id:nogawanogawa:20180503140508p:plain

あとは、セルにコードを書いていくだけです。

適当に使ってみる

人様のコードを拝借。 拝借したのはこちら。

qiita.com

先にGPUの設定だけやっちゃいました。

編集 > ノートブックの設定

からGPUを選択します。

Input

入力はこちら。

Output

おお〜。特に環境構築もせず動きましたし、GPUもちゃんと使えてますね。

どうやらGPUを使えば10倍程度は速くなることが期待できるようです。

感想

正直に言うと、想像以上にめんどくさいです。 notebook形式に慣れていないってのもあるんですが、それ以外にも制約がいやですね。

まず、ファイルIOがGoogle ドライブ経由なんですが、それが手間がかかります。

それから、こちらの記事をみると時間に関して制約があるみたいです。

qiita.com

12時間制約は置いておいて、90分制約はちょっと嫌ですね。 セッションが切れたら計算が止まるのはやりたいことできなさそうなので、おとなしく普通のクラウドにしますか、、、

【論文メモ:StackGAN】StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks

論文

[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks

著者

Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang, Xiaogang Wang, Xiaolei Huang, Dimitris Metaxas

Rutgers University, Lehigh University, The Chinese University of Hong Kong, Baidu Research

背景

テキスト表現を基に写実的画像を生成することは、コンピュータビジョンの大きな課題となっている。 先行研究では、文字の意味を反映した大まかな画像を生成することには成功していたが、詳細な部分の表現や物体の要素については表現できない問題があった。

目的とアプローチ

目的

テキスト表現に基づく高解像度の写実的画像の生成

アプローチ

StackGAN(Stacked Generative Adversarial Networks)による画像生成の段階的詳細化

  • 第一段階:テキスト表現から低解像度の画像を出力
  • 第二段階:第一段階の出力とテキスト表現から高解像度の画像を出力

提案手法

StackGANの全体構成を下記に示す。

f:id:nogawanogawa:20180414144515j:plain

StackGANは2段階の画像生成プロセス(Stage-Ⅰ GAN, Stage-Ⅱ GAN)から構成される。

Stage-Ⅰ GAN

Stage-Ⅰ GANでは、大まかな形状、ベースとなる色や背景画像の領域を描画する。

Stage-Ⅰ GANは入力としてテキスト表現を使用する。 先行研究で、テキストのエンコード非線形の変換となるため、Generatorへの入力となる潜在変数は偏りが生じることがわかっている。 一方で、潜在変数のベクトルは高次元(>100)になることが多く、入力の不連続性が大きくなり、不安定な学習になる恐れがある。

この問題を解決するために、平均(μ(φt ))、対角共分散行列(diagonal covariance matrix, Σ(φt))となるガウス分布(N (μ(φt ), Σ(φt )))から無作為に値をサンプリングする。 これにより、多様性を維持することができ、少ない入力テキスト表現から幅広い分布を生成することができる。

過学習を避けるために、Lossにカルバック・ライブラー情報量(Kullback-Leibler divergence)を用いた調整を加える。 下記にStage-Ⅰ GANでのGenerator, DiscriminatorのLossの算出式を示す。

f:id:nogawanogawa:20180429105102j:plain

その他

実装の詳細について下記に列挙する。

  • テキストの潜在変数(φt )はガウス分布の平均μと∑の値であるσの全結合層として組み込まれる
  • λ =1
  • c0 = μ0 + σ0 ⊙ ε
補足

多次元の正規分布に関してはこちら。 s0sem0y.hatenablog.com

入力に関しての全体像についてのイメージは下記のようになる。 f:id:nogawanogawa:20180429111152j:plain

テキストから得られるガウス分布と、予め用意したガウス分布を組み合わせて入力の多様性を維持する(偏りをなくす)ようです。

Stage-Ⅱ GAN

Stage-Ⅰ GANでは、画像に歪みや欠損が残る。 Stage-Ⅱ GANでは、細部を描画し低解像度画像の欠損を修正する。

Stage-Ⅱ GANでは、Stage-Ⅰ GANで出力された低解像度の画像とテキスト埋め込みベクトルを再使用する。

下記にStage-Ⅱ GANでのGenerator, DiscriminatorのLossの算出式を示す。

f:id:nogawanogawa:20180429112717j:plain

実装のパラメータ

実装のパラメータについて下記に列挙する。

アップサンプリングブロック
ダウンサンプリングブロック
パラメータ他
  • Ng =128
  • Nz =100
  • Mg =16
  • Md =4
  • Nd = 128
  • W0 = H0 = 64
  • W = H = 256
  • 始め600epochはStage-II GANを修正しながら実行、次の600epochはStage-I GANを修正しながら実行
  • バッチサイズ64のAdam Optimizerを使用
  • 学習率0.0002で100epochごとに学習率を半減する

評価

データセット

下記に示す2種類のデータセットを使用して評価を行う。

  • Caltech-UCSD Bird(CUB)
  • Oxford-102 flower

比較対象

下記に示す2つの先行研究と比較する。

  • GAN-INT-CLS
  • GAWWN

評価指標

Inception Score

画像分類器に生成画像を分類させ、下記の式によるInception Scoreを算出する。 (数値が大きいほど優れている)

f:id:nogawanogawa:20180503105733j:plain

Human Rank

各モデルによって生成された画像を被験者(人間)に見せてランク付けする。 (数値が小さいほど順位が高く、優れている)

多様性と画質に関する評価

Inception ScoreとHuman Rankの結果を以下の表に示す。

f:id:nogawanogawa:20180503105943j:plain

比較対象より提案手法が優れていることが分かる。 次に各モデルによって生成された画像(Caltech-UCSD Bird)を下記に示す。

f:id:nogawanogawa:20180414150455j:plain

また、各モデルによって生成された画像(Oxford-102 flower)を下記に示す。

f:id:nogawanogawa:20180414150507j:plain

先行研究のモデルより高解像度かつ細部まで表現できている事がわかる。

設計の妥当性評価

次に、設計の妥当性に関して評価する。

Stageの段階分け

ガウス分布(CA)の使用、テキストの二段階活用、Stageの段階分けに関する結果を下記の表に示す。 f:id:nogawanogawa:20180503112116j:plain

ガウス分布(CA)の使用、テキストの二段階活用をどちらも行った場合が最もInception Scoreが高いことが分かる。

次に、Stageごとの生成画像を下記に示す。 f:id:nogawanogawa:20180414150520j:plain

Stageを経る毎に輪郭がはっきり、高精細な画像になっていることが分かる。

また、入力Textに対して生成された画像と近しいTraning Setを下記に示す。 f:id:nogawanogawa:20180414150537j:plain

Datasetを学習して、正しく反映できている事がわかる。

ガウス分布による入力生成

先に示したTable 2で、128×128の画像のInception Scoreを見ると、CAを使用した場合の方がInception Scoreが向上する結果がわかった。

また、同じTextから生成された画像を下記に示す。 f:id:nogawanogawa:20180414150549j:plain

同じ入力から別々の画像が生成されていることがわかり、多様性が担保されていることが分かる。

入力Textへの対応評価

入力のTextを一部変化させた際の出力画像を下記に示す。 f:id:nogawanogawa:20180414150601j:plain

入力のTextの変化が正しく画像に反映されている事がわかる。

結論

テキスト表現を基に高解像度の写実的画像を生成することは、コンピュータビジョンの大きな課題となっている。 提案手法により、テキスト表現だけを入力する場合で初めて256×256の画像の生成に成功し、細部までの表現が可能になった。

実装

どう考えてもMacBook Airでは現実的な時間内で計算が終わらないので、今回は実装はありません。 ただでさえ、最近マシンパワーの限界を感じてるのに200 epochとか普通に考えてGPU使わなきゃ無理でしょう。。。←クズでごめんなさい。

AWSやらGoogle Colabの使い方を勉強したら、そのタイミングで別の記事で投稿します。

感想

GANで高解像度の画像を生成することは一つの大きなテーマになっているようです。 何に応用できるかまではまだわかりませんが、やり方くらいはマスターしたいですね。 引き続きがんばります。

TensorFlowでの画像の読み書きに関する覚書

これまではサンプルデータセットを使って遊んでおり、オリジナルデータを使い方を知らなかったのでその備忘録です。

今回参考にしたのはこちら。

qiita.com

TensorFlowで対応している画像種類

まずは、画像の形式として何が使えるかの確認です。 TensorFlowのガイドを見てみると、主にjpegpngは想定されているようですね。

その他、bmpとgifもデコードだけ関数が提供されている形のようです。

https://www.tensorflow.org/api_guides/python/image#Encoding_and_Decoding

画像データの読み込み

画像データの読み込みですが、こんな感じになります。

f:id:nogawanogawa:20180501191420j:plain

画像形式に応じてデコードの関数が変わるので微調整が必要そうですが、基本的には変わらないようです。

画像データの書き出し

画像の書き出しは、調べてみた感じは標準で画像を保存するための関数は提供されてないみたいですね。

encodeまでは標準の関数を使って書き込んで、あとは普通にファイルに書き出します。

ファイル書き出しはこんな感じですね。

サンプルコード

実際は用途に応じてカスタムしますが、カスタマイズする前段階の関数セットはこちら。

https://github.com/nogawanogawa/imgIO_test_tensorflow.git

【論文メモ:CycleGAN】Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

論文

[1703.10593] Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

著者

Jun-Yan Zhu∗ Taesung Park∗ Phillip Isola Alexei A. Efros

Berkeley AI Research (BAIR) laboratory, UC Berkeley

背景

画像を別の画像ヘ変換(image-to-image translation)は、コンピュータビジョンの大きな分野の一つとなっており、 これには整備されたデータセットを使用して入力画像と出力画像のマッピングを学習させる必要がある。 しかし、多くの場合トレーニングデータが利用できない場合が多いという問題がある。

目的とアプローチ

目的

  • image-to-image translationの学習における学習データセットの削減 (対になるデータセットを用意する必要がない)

アプローチ

  • CycleGAN(循環による首尾一貫性の利用)

提案手法

学習プロセス

学習の考え方の概要について下記に示す。 f:id:nogawanogawa:20180402171949j:plain

上図のように、提案手法では二種類の画像の集合をX、Yに対してX➝Y、Y➝Xの変換を行うGeneratorを用意する。 加えて、双方に対応するDiscriminatorも2つ用意する。

提案手法では二種類のloss(Adversarial Loss, Cycle Consistency Loss)を考慮する。 ネットワーク全体でのlossを下記に示す。 f:id:nogawanogawa:20180402171356j:plain

上記のlossを下記の目的関数を満たすように学習を行う。 f:id:nogawanogawa:20180402171626j:plain

補足

全体の構成の概念図を下記に示す。 f:id:nogawanogawa:20180407144816j:plain

図のようにGenerator2つ(G1, G2)とDiscriminator2つ(D1, D2)を組み合わせて学習行う。 そのため、入力は常に画像となる。

Adversarial Loss

Adversarial Lossについて下記に示す。 f:id:nogawanogawa:20180402170530j:plain

Adversarial Lossは入力画像をもとにGenerator (G)が画像を生成した際に生じるlossを表す。

Cycle Consistency Loss

Cycle Consistency Lossについて下記に示す。 f:id:nogawanogawa:20180402171021j:plain

Cycle Consistency LossはGenerator (G)が生成した画像を入力画像に戻した際に生じるlossを表す。

Cycle Consistency Lossでは、循環して生成された分布を教師データと比較させることで、lossを算出する。 そのため、Cycle Consistency Lossを求める際にはDiscriminatorは使用しない。

実装

ネットワーク構造

実装は下記の論文を参考にする。

https://arxiv.org/abs/1603.08155

ビルディングブロックとしてストライド2の畳み込み層、いくつかの剰余区画そしてストライド1/2の畳み込みを組み合わせて使用する。

128×128の画像に対して6層ネットワーク、256×256の画像に対して9層ネットワークを使用する。

Discriminatorとして、70×70のPatchGANを使用する。

その他

評価

評価指標

評価に使用する指標を下記に示す。

AMT perceptual studies

Generatorによって生成された画像と教師データを被験者に見せ、どちらが本物であるかを当てさせる評価。 地図と航空写真の変換を対象とする。

FCN score

全結合によるニューラルネットに画像を判定させる評価。 路上の車の写真とラベルの変換を対象とする。

Semantic segmentation metrics

写真からラベルへの変換を対象とする。 ピクセルレベルのラベル分類精度、クラスごとの精度、クラスの境界に関する精度を見る評価。

比較対象

下記の5つのモデルと提案手法を比較する。

  • CoGAN
  • SimGAN
  • Feature loss + GAN
  • BiGAN/ALI
  • pix2pix

先行研究との比較

先行研究との比較をTable 1から Table 3に示す。 f:id:nogawanogawa:20180414133053j:plain

f:id:nogawanogawa:20180414133106j:plain

f:id:nogawanogawa:20180414133119j:plain

pix2pixを除いて先行研究より高い精度の画像認識精度が達成されている。(※)

実際にGeneratorによって変換された画像を下記に示す。

f:id:nogawanogawa:20180414132347j:plain

f:id:nogawanogawa:20180414132523j:plain

先行研究よりもより高い精度で変換できていることが分かる。

※pix2pixでは入力に対応する教師データを1対1で用意するため、精度が高いと考えられる。

Adversarial LossとCycle Consistency Lossの組み合わせに関する評価

f:id:nogawanogawa:20180414133510j:plain

f:id:nogawanogawa:20180414133522j:plain

f:id:nogawanogawa:20180414133917j:plain

提案手法の適用範囲に関する評価

pix2pixと同様の評価

写真からラベル付け、線画から写真の生成もpix2pixと同様に提案手法によって可能である事がわかる。 f:id:nogawanogawa:20180414134121j:plain

f:id:nogawanogawa:20180414135830j:plain

style transfer

描画の手法の自動変換も可能である事がわかる。

f:id:nogawanogawa:20180414135420j:plain

f:id:nogawanogawa:20180414135438j:plain

絵画から写真への変換

過去の絵画から当時の情景を表現することが可能だと言うことが分かる。

f:id:nogawanogawa:20180414135453j:plain

オブジェクトの変換および季節の変換

写真内部の季節や物体を別のものに変換できると言うことが分かる。 f:id:nogawanogawa:20180414135509j:plain

物体の強調

着目する物体の周りをぼかすことで対象物を強調する変換画家のということが分かる。 f:id:nogawanogawa:20180414135525j:plain

写真から絵画の作成

写真を入力に有名絵画に似せた絵画を作成できるということが分かる。 f:id:nogawanogawa:20180414135540j:plain

先行研究で失敗している部分についても変換できていることが分かる。 f:id:nogawanogawa:20180414135553j:plain

課題

変換がうまくされないものもある。 f:id:nogawanogawa:20180414135607j:plain

  • 画像生成をうまくいかない場合がある(Generatorの改良による表現力の向上が必要)
  • 馬に人が乗ったケースは少なく、変換に失敗している(教師データの多様性が不可欠)
  • ラベル付けが曖昧になりがち(半教師無し学習が必要の可能性)

実装

いろんな人のを継ぎ接ぎして参考にした実装はこちら。

loss

Generator

Discriminator

その他

全体はgithubをご参照下さい。

https://github.com/nogawanogawa/CycleGAN_tensorflow.git

試しに回してみた結果

失敗しました。

丸3日かけて頑張って計算しても、20epochちょいしかいけなかったので、そこで打ち切りました。(全部で100epochなので、終わるには10日程度かかりそうでした…) ということで、残骸を乗せておきます。

左側が入力画像で、右側が出力画像です。 上段がhorse -> zebra、下段がzebra -> horseです。

上段は入力画像がそもそもイケてないので変化が見られませんが、なんか頑張ってるのは伝わります。 下段はそれなりにまともな画像なんですが、シマウマはシマウマのままです。馬に変化するにはもっと時間が必要のようです。

epoch = 0

f:id:nogawanogawa:20180428211704p:plain

epoch = 5

f:id:nogawanogawa:20180428211725p:plain

epoch = 10

f:id:nogawanogawa:20180428211738p:plain

epoch = 15

f:id:nogawanogawa:20180428211751p:plain

epoch = 20

f:id:nogawanogawa:20180428211808p:plain

epoch = 22

f:id:nogawanogawa:20180428211821p:plain

感想

論文の評価以降はあんまり興味ないので、結構すっ飛ばしました。 とりあえず良いということは理解したので、だいじょうぶかと。。。 許してください。

実装については、ここまで来ると5年選手のMacBook Airの限界です。。。 無料のクラウドを勉強して、お遊び系はそっちに移行するようにしたいと思います。

【論文メモ:BEGAN】BEGAN: Boundary Equilibrium Generative Adversarial Networks

論文

https://arxiv.org/abs/1703.10717

著者

David Berthelot, Thomas Schumm, Luke Metz

Google

背景

GANはGeneratorとDiscriminatorの2つの関数から構成される、データの分類と生成を行うニューラルネットワークである。 GANは非常に精巧なな分布を生成できる一方で、解決されていない課題も多い。 特に、学習の安定性については非常に難しく、学習が正常に機能しないことが多々発生してしまい、正確にハイパーパラメータを設定することが求められる。

この問題には、GeneratorとDiscriminatorの学習のバランスが非常に重要になる。 一般に、学習の初期はDiscriminatorが早く学習され先に精度が高くなる。 これに起因してmodel collapseと呼ばれる、Generatorが単一の画像しか生成できなくなる現象が起こってしまう。

目的とアプローチ

本論文では、下記の特徴を持つBEGAN(Boundary Equilibrium Generative Adversarial Networks)を提案する。

  • シンプルで頑丈なアーキテクチャ
  • Generatorの学習率に応じてDiscriminatorの制御
  • 画像の精度と多様性を両立
  • 収束までの行程の見積りが可能

提案手法

BEGANの設計の概念図を下記に示す。

f:id:nogawanogawa:20180324172131p:plain

特徴を下記に列挙する。

  • BEGANでは、Discriminatorとしてオートエンコーダを使用する
  • 全ての畳み込み層はexponential linear units (ELUs)を活性化関数をとして使用する
  • Down samplingはstride=2のsub samplingとする
  • Up samplingは近傍点を取得することで実現する
  • EncoderとDecoderの境界では、全結合層によってデータの受け渡しを行うものとする
  • 通常のlossとは異なり、ワッサースタイン計量から算出したlossを使用する

BEGANのlossの算出式は以下の様になる。

f:id:nogawanogawa:20180324181021j:plain

ここで、

f:id:nogawanogawa:20180402092243j:plain


k_0 = 0


\lambda_k = 0.001

  • 学習率 = 0.0001
  • 畳み込み層のサイズは8×8
  • h(全結合層の次元) = z(Generatorの入力次元) = 64
  • 一番学習が大きなモデルで、n(チャンネル数) = 128

最大のモデルでGPUを使用して学習に2日半、小さめのモデルで数時間学習させた。

収束の測定

GANの学習が収束したことを判断することは、GeneratorとDiscriminatorのlossが相反するため、非常に難しいとされている。 GANが十分に学習した、あるいはModal Collapseに陥ったことを判定するために、下記の指標を用いる。

f:id:nogawanogawa:20180407104347j:plain

補足

ネットワーク全体の構成図は下のようになる。 f:id:nogawanogawa:20180407092956j:plain

エンコーダとデコーダを使用した画像分類器を使用したものをDiscriminatorとして使用している。

(参考:オートエンコーダ) deepage.net

(参考:Energy Based GAN)

https://arxiv.org/abs/1609.03126

評価

EBGAN(比較対象)で生成した画像とBEGANで生成した画像の比較を下記に示す。 f:id:nogawanogawa:20180407112206j:plain

EBGANでは画像が崩れてしまっているが、BEGANではきれいに生成されており、 安定した学習がされていることが確認できる。

また、画像変換を実行した結果を下記に示す。

f:id:nogawanogawa:20180407112225j:plain

比較対象と遜色ない精度で画像が生成できていることが確認できる。

lossと生成される画像を下記に示す。

f:id:nogawanogawa:20180407113211j:plain

かなり早い段階で高い精度の画像が生成できていることが確認でき、継続的にlossが減少していることが確認された。

結論

現状の未解決問題は多々ある。

  • Discriminatorはオートエンコーダの機能を果たす必要があるか
  • 画素レベルでのフィードバック制御は収束のために非常に効果的であるが、オートエンコーダはその再描画の必要があり、潜在層の最適なサイズは不明確
  • 入力のノイズはどの程度が最適か、オートエンコーダは他のモデルを使用した方がよいのかなど、問題は山積みである。

本論文では、オートエンコーダをDiscriminatorとして使用することで、GeneratorとDiscriminatorが安定するアーキテクチャを提案した。 この手法によって、重みの動的制御が可能になり、他分野への応用にも貢献できると考えられる。 提案手法では、学習率の調整をしながら画像の解像度は落とさず、GANの課題に対する一つの解決策となっている。

実装

それっぽく書いてあります。細かいところ違っていたらごめんなさい。 論文で使用しているデータセットselebaは、画像サイズを整えるのがめんどくさかったので、今回はCIFAR-10を使用しました。

コードそのまんまはこちら。

https://github.com/nogawanogawa/BEGAN_tensorflow.git

実行結果

i = 0

始めはこんなもんです。なんで真っ黒なのか。。。

f:id:nogawanogawa:20180410195937p:plain

i = 2000 × 20

まだなんもわかりません。

f:id:nogawanogawa:20180410195953p:plain

i = 2000 × 40

このへんでとりあえずバラバラな画像が生成されていることが確認できたので一安心。

f:id:nogawanogawa:20180410200000p:plain

i = 2000 × 60

なんか後ろにいるのは確認できますが、何がなんだかはわかりません。

f:id:nogawanogawa:20180410200010p:plain

i = 2000 × 80

段々輪郭がはっきりしてきましたが、まだ何が写っているかわかりません。

f:id:nogawanogawa:20180410200021p:plain

i = 2000 × 100

ピントがあってない感じですね。

f:id:nogawanogawa:20180410205901p:plain

i = 2000 × 120

惜しいとこまできてるんですがもう少ししないと何が写ってるか判別が難しいです。

f:id:nogawanogawa:20180410223335p:plain

i = 2000 × 140

f:id:nogawanogawa:20180411185234p:plain

i = 2000 × 160

f:id:nogawanogawa:20180411185244p:plain

i = 2000 × 180

f:id:nogawanogawa:20180411185257p:plain

i = 2000 × 200

f:id:nogawanogawa:20180411185309p:plain

i = 2000 × 220

f:id:nogawanogawa:20180411193349p:plain

i = 2000 × 240

f:id:nogawanogawa:20180411205621p:plain

最終型

50epoch回してこれなんで、もうノートPCじゃ無理っす。。。 手応え的には、もうあと20epochくらいいけば判別はつくレベルになるかもしれないですね。

f:id:nogawanogawa:20180411214221p:plain

感想

書いてみてから気づいたんですが、tensorboardとかでlossを比較して見てみないと、学習がどう良くなったか判断できないですね。。。

なんかツールのバーションが噛み合って無くてtensorboardがうまく起動しないので、覚えてたらそのうちやります。