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

どちらかといえばエミリア派です

【論文メモ:HDGAN】Photographic Text-to-Image Synthesis with a Hierarchically-nested Adversarial Network

論文

[1802.09178] Photographic Text-to-Image Synthesis with a Hierarchically-nested Adversarial Network

著者

Zizhao Zhang, Yuanpu Xie, Lin Yang
University of Florida

背景

テキストから写実的画像を生成すること(Text-to-Image)は生成モデルの分野での大きなテーマとなっている。 このテーマでは、精細な画像を生成することと入力したテキストとの一貫性を両立することが必要になる。

Text-to-Imageの分野では、近年ではGANを用いた生成モデルが多数提案されている。 GANを使用する場合には学習の収束と安定性が大きな課題となる。 これらの課題を解決し解像度とテキストの一貫性を実現するような先行研究が行われてきたが、解像度が低かったり大きなネットワークを必要としたりと、まだまだ確立した手法があるとは言えない。

目的とアプローチ

目的

高解像度かつテキスト一貫性を併せ持つ生成モデルの実現

アプローチ

HDGAN (High-Definition results and the idea of Hierarchically-nested Discriminators)

  • one generator - multi discriminator の使用によるステージングを必要としない
  • 中間生成画像を段階的にDiscriminatorに入力するLoss

提案手法

HDGAN

GANを使用した生成モデルの先行研究では、学習を安定させるためにStageを使用したり、multi Discriminatorにすることで、DiscriminatorがGeneratorより過剰に学習していくことを回避していた。 今回の提案手法であるHDGANの概要を下記に示す。

f:id:nogawanogawa:20180625223238j:plain

HDGANは、Generator1つに対して、複数の階層的Discriminatorを用意する。 Generatorの中間生成画像をそれぞれDiscriminatorに入力することで、Generatorを1つにすることが可能である。

また、先行研究と提案手法を比較を下記に示す。

f:id:nogawanogawa:20180625223635j:plain

(A)StackGANでは、低解像度の画像を生成するStage-Ⅰと高解像度の画像を生成するStage-Ⅱの二段階のステージを使用する。 Stage-Iを先に重点的に学習することで、安定した学習が可能になる一方で、通常のネットワークに加えステージを導入するためアーキテクチャが複雑になる。

(B)また、GMANのようにDiscriminatorを複数使用したGANのモデルも提案されている。 これによって、Discriminatorに1つの場合より、Generatorの学習が安定する。 一方で、これを高解像度の場合に適用してうまくいくかは不透明である。

(C)さらに、PGGANでは低解像度から高解像度まで段階的にGeneratorとDiscriminatorの層を増やしていく。 これにより、低解像度の層が安定するまで学習して層を追加するので、安定して学習させる事ができる。 一方で、高解像度を生成しようとするにつれて、高い演算性能ができる。

(D)提案手法では、Generatorの中間生成物と対応する解像度のDiscriminatorに入力する。 これにより、隠れ層の出力に対するフィードバックの信号がより強いフィードバックとして反映されるため、学習が安定化する。

Multi-purpose adversarial losses

一般的なGANの目的関数を下記に示す。

f:id:nogawanogawa:20180702213014j:plain

ここでGはGenerator、DはDiscriminatorを表している。 このように一般的なGANではGeneratorとDiscriminatorのLossを最小化することが目的関数になっている。 このときのLossは下記の様になっている。

f:id:nogawanogawa:20180702213741j:plain

Eはクロスエントロピーを表し、DiscriminatorをGeneratorに対して2つの項を考えている。

一方、HDGANの目的関数を下記に示す。

f:id:nogawanogawa:20180702213105j:plain

一般的なGANに対して、Textに関する項tが追加されている。 このときのLoss計算の概念図とLossの計算式を下記に示す。

f:id:nogawanogawa:20180625223709j:plain

f:id:nogawanogawa:20180702213118j:plain

HDGANでは、Discriminatorが複数あるmulti-Discriminatorの構成を取るため、Generatorの隠れ層の分だけLossを個別に計算して足し合わせ る。 そのため、Lossも各階層について計算した後、総和を取ることで表現される。

Architecture Design

Generator

Generatorは単純な3つのモジュールで構成される。

  • K-repeat Res block
    • 畳み込み層×2
    • ReLU
    • batch normalization
  • stretching layers
    • サイズ2の近傍アップサンプリング
    • ReLU
    • 畳み込み層×1
    • batch normalization
  • linear compression layers
    • 畳み込み層
    • Tanh(RGB空間に圧縮)

入力は conditioning augmentationと学習済みのembedding matrixによって生成された1024×4×4のembeddingを使用する。

Discriminator

Discriminatorはシンプルにストライド2の畳み込み層に対してバッチノーマライゼーションとLeakyLUを適用させる。 実装には2通りの選択肢がある。 1つはDiscriminatorそれぞれに対して教師データと生成データの判別を行う方法である。 もう1つは、始めに512×4×4の特徴マップと128×4×4のtext embeddingを合体させる。 それからサイズ1の畳み込み層を使用してテキストと画像の特徴を統合し、4×4の畳み込み層によって画像とテキストのペアに対して教師データと生成データとを判別する。

その他の最適化等は通常のGANと同様であるため割愛する。

評価

Experimental Setup

Dataset

評価に使用するデータセットは下記の3種類である。

  • CUB dataset
  • Oxford-102
  • COCO dataset

Evaluation metric

評価の指標としてInception scoreとMulti-scale structural similarity (MS-SSIM score)を使用する。 これら2つはGANの評価に広く使用されている一方、テキストと生成画像の一貫性については評価できない。 そこで本研究では、 Visual-semantic similarityを評価指標として導入する。

Visual-semantic similarityは下記の式によって評価する。

f:id:nogawanogawa:20180702213933j:plain

ここでvはインセプションモデルによって抽出された特徴ベクトルを表す。 スコアリング関数cを使用して二次元のロスを計算している。

テスト段階においては、text embeddingと生成画像のペアで算出される特徴ベクトルは同じであることが望ましい。 上の式によって、ペアの特徴ベクトルが親しいほど、大きく算出される仕組みとなっている。

先行研究との比較

提案手法の妥当性を評価するために、先行研究との比較を行う。 比較対象は、GAN-INT-CLS、GAWWN、TAC-GAN、Progressive GAN、StackGAN、StackGAN++をとする。 特に、StackGANについては詳細に評価する。

提案手法と比較対象のInception scoreを下記に示す。

f:id:nogawanogawa:20180625224100j:plain

HDGANでは、CUBのデータセットでStackGANに比べて45%、StackGAN++に比べて31%良いなど、先行研究に対して非常に良い効果が得られている事がわかる。 Oxford-102では、TAC-GANと同等の結果が得られているが、TAC-GANで使用しているような付加情報を本研究では使用していないという優位性がある。

提案手法とStackGANで生成された画像を下記に示す。

f:id:nogawanogawa:20180625224207j:plain

f:id:nogawanogawa:20180625224241j:plain

提案手法のほうが、文章の詳細も表現され、自然な色使いで複雑な形状を表現できている。

解像度別のInception scoreを下記に示す。

f:id:nogawanogawa:20180625224313j:plain

解像度が高くなってもInception scoreはStackGANより優れている。 また、StackGANでは画像の一貫性が崩れているが、HDGANでは解像度を大きくしたときに画像の一貫性が崩れていない。

Visual-semantic similarityの評価を下記に示す。

f:id:nogawanogawa:20180625224124j:plain

HDGANのほうが値が大きく、意味論的な一貫性が取れていることがわかる。

さらに多様性についても評価した結果を下記に示す。

f:id:nogawanogawa:20180625224438j:plain

HDGANは、同じ入力からでも広いバリエーションで画像を生成できている。

MS-SSIMについてStackGAN・Prog.GANと比較した結果を下記に示す。

f:id:nogawanogawa:20180625224507j:plain

StackGANよりEquallity lineより小さく、多様性の高い優れたモデルとわかる。 また、Prog.GANと比較してもMS-SSIMの値は優れている。

文を書き換えによるstyle transfer

文の書き換えによるstyle transferに関する結果を下記に示す。

f:id:nogawanogawa:20180625224528j:plain

提案手法により、なめらかに画像が変換されている事がわかり、細部まで表現されている。

考察

階層的敵対性学習

階層化した学習の妥当性に関して、下記に示す。

f:id:nogawanogawa:20180625224558j:plain

Discriminatorの層が深くなればなるほど、当手法は有効であると考えられる。 また、StackGANではStageごとにTextを入力していたが、当手法では入力は一度だけにもかかわらず、良い結果となっている。

局所的画像のLoss

局所的画像のlossの使用について評価する。

f:id:nogawanogawa:20180625224614j:plain

上の表ではlocal image lossを使用した場合(w/)、使用しない場合(w/o)よりも値が優れることがわかる。 そのため、local image lossの活用は妥当であるといえる。

また、下記の図からも、テキストの内容をより詳細に反映した画像を生成できることがわかる。

f:id:nogawanogawa:20180625224632j:plain

結論

本論文では、中間生成画像をDiscriminatorに階層的に学習させるHDGANを提案した。 本手法により、先行研究よりテキストに忠実かつ表現力のある生成モデルが実装されることがわかった。

【論文メモ:PGGAN】Progressive Growing of GANs for Improved Quality, Stability, and Variation

論文

https://arxiv.org/abs/1710.10196

著者

Tero Karras, Timo Aila, Samuli Laine, Jaakko Lehtinen
NVIDIA

背景

生成的手法の中でも現在特に優れているものには、autoregressive models、variational autoencoders (VAE) そして generative adversarial networks (GAN)などが挙げられる。 これらにはそれぞれ長所・短所があり、現在も研究が進められている。

このうち、GANは生成する分布(画像など)の解像度が高くなるに連れてランダム要素の影響が色濃くなり、DiscriminatorはGeneratorの生成分布と教師データを区別することが容易になってしまい、ネットワーク全体の学習が不安定になる。 このように、GANは高解像度の画像を出力することが難しいという問題がある。

目的とアプローチ

目的

  • GANを用いた高解像度分布の生成

アプローチ

PGGAN(Progressive Growing of GANs)

  • 段階的にネットワーク層を増加させ、追加した層の影響を学習に度合に応じて比重を変化
  • ミニバッチ標準偏差を活用した多様性の向上
  • マルチスケールによるワッサースタイン計量を用いた統計的類似度の使用

提案手法

PGGAN(Progressive Growing of GANs)

PGGAN(Progressive Growing of GANs)の概念図を下記に示す。

f:id:nogawanogawa:20180528215414j:plain

PGGANでは、低解像度の画像(上では4×4)から学習を開始し、徐々に層を追加することで対象の画像の解像度を向上させる。 層を新しく追加する際には、学習がなされていないためランダム要素が強く、Generatorの出力にランダム要素が強く反映されてしまう。 そこで、PGGANでは下図のように、出力に対する新しく追加した層の影響度(α)を段階的に増やす。

f:id:nogawanogawa:20180528215600j:plain

これにより、ネットワーク全体の出力として学習が完了していない層のランダム要素を軽減することが可能になり、学習が安定化する。

ミニバッチ標準偏差を活用した多様性の向上

GANでは、学習データの範囲でしか特徴を学習できず、学習データの限られた特徴に大きく影響された学習をしてしまう恐れがある。 この問題を解決するために、ミニバッチの標準偏差を用いた正規化によってミニバッチのまとまりから得られる特徴を学習する方法を導入する。

はじめに、ミニバッチ内のテンソル(H×W×C)で同じ位置に対応する画素について標準偏差を計算し、H×W×Cのテンソルを一つ求める。 次にそのテンソル内のすべてのピクセルの平均を計算し、スカラ値を一つ得る。 最後にそのスカラ値を複製し、一つのテンソルを作成する。

この処理は、理論上ネットワークのどこにでも挿入することができるが、諸々の事情からDiscriminatorの最終層に挿入する。 (詳細は論文のAppendix参照)

補足

イメージとしてはこんな感じらしいです。

f:id:nogawanogawa:20180603112433j:plain

GeneratorとDiscriminatorの正規化

学習データに特徴的な学習データが含まれている際に、そのデータに学習結果が強く影響を受けてしまう問題がある。 一般にこの問題に対してはバッチノーマライゼーションを使用して対処することが多い。 しかし、我々はGANのネットワーク自体が問題なのではなく、学習信号の大きさとその評価に制限がないことに問題があると考えた。

そこで我々は下記の2つの成分を使用することでこの問題に対処する。

Equalized learning rate

従来のネットワークの重みの繊細な初期化は行わず、0~1の範囲での初期化に対して実行時にネットワークの重みを変化させる。 ネットワークの重みに下記の式を導入する。


\hat{\omega_i} = \omega_i / c

ここで、\omega_iはネットワークの重み、cはレイヤごとの標準化定数を表す。

通常Adamなどでは、入力パラメータとは独立に標準偏差をもとに勾配を決める。 そのため、ダイナミックレンジが大きいパラメータはそうでないパラメータよりも学習に時間を要する。 我々の手法では、ダイナミックレンジを考慮されるため、すべてのパラメータで均質の学習スピードを確保することができる。

Pixelwise feature vector normalization in generator

GeneratorとDiscriminatorがコントロールできなくならないように、Generatorの各畳み込み層のあとに各ピクセルごとにfeature vectorを正規化する処理を行う。

f:id:nogawanogawa:20180603122733j:plain:w280

ここで、\epsilon=10^{-8}はネットワークの重み、Nは特徴マップの数(チャンネル数)、abはそれぞれオリジナルと正規化された特徴ベクトルを表す。

これにより、変化の小さな学習の際には影響は小さく、変化の大きな学習の際には必要に応じて信号を減衰させることができる。

マルチスケールにおける統計的類似性の使用

異なるGANのモデルを評価するには、膨大な数の生成画像を評価する必要があり、主観的になってしまう。 したがって、これらの評価には画像から得られる指標を用いて自動的に評価する必要がある。 これまでも、multi-scale structural similarity (MS- SSIM)のような手法もあったが、色や形状の多様性による細かな効果には影響しにくい。

我々は、優れたGeneratorはどんなスケールにおいても学習データと類似した局所的画像構造を生成するものだと考えている。 そこで、教師データとラプラシアンピラミッドによって得られる局所イメージを統計的に比較する手法を用いる。 連続するピラミッド階層において、前のレベルをアップサンプリングしたものと次のレベルとの差分を見ることで、これを実現する。

各層は7×7の画素近傍によって表現される記述子(各層128個)で表現される。 それぞれの記述子を正規化し、標準偏差を計算、その後ワッサースタイン計量によって類似度を判定する。 これにより、小さい解像度部分で見たときの差分は画像全体の大まかな構造を捉え、高解像度部分で見たときの差分は輪郭やノイズといった部分まで表現する。

補足

イメージとしてはこんな感じみたいです。

f:id:nogawanogawa:20180603153152j:plain

評価

実際に生成された画像はこちら。

youtu.be

統計的類似度に関する評価

sliced Wasserstein distance (SWD) とmulti-scale structural similarity (MS- SSIM)に関する評価を行う。

条件は下記のとおり。

  • 最新のloss function (WGAN-GP)と学習の設定を使用
  • 学習データ : CelebA, LSUN BEDROOM
  • 解像度 : 128×128

次の表は数値的にSWDとMS-SSIMに関してワッサースタイン計量とMS-SSIMを計算した結果である。

f:id:nogawanogawa:20180528215914j:plain

また、提案手法によって提案された画像を下記に示す。

f:id:nogawanogawa:20180528220113j:plain

直感的に、良い評価指標では様々な色や形状、視点が反映されたもっともらしい画像が良い評価とされるべきである。 つまり、(h)の行が最も値が小さくなるはずである。 しかし、今回それがMS-SSIMには見られない。 そのため、MS-SSIMより提案手法のSWDのほうが良い指標と考えられる。

収束及び学習スピード

収束と学習速度に関する評価結果を下記に示す。

f:id:nogawanogawa:20180528220454j:plain

図(a)はprogressive growingがない場合、(b)はprogressive growingがある場合を示している。 これらを比較すると、progressive growingを使用したほうが収束時のSWDの値が小さく、学習時間を短縮できている事がわかる。

progressive growingなしだとマクロな視点とミクロな視点の両方の学習を同時にこなす。 一方progressive growingありの場合は低い解像度の学習は終わっているため、解像度を大きくしたときに安定して学習できている。

図(b)より、各ラプラシアンピラミッドの層において、はじめの低解像度のときはまっすぐSWDが減少している。 解像度が向上しても、一貫してSWDは減少傾向を示している。 一方、図(a)ではすべての各ラプラシアンピラミッドの層で似たカーブの動きを見せ、データによって共鳴した学習をたどっている。

図(c)より、progressive growingを使用した場合は1024×1024の画像について収束するまでに96時間要したのに対し、progressive growingを使用しなかった場合には520時間を要した。 そのため、progressive growingを使用したほうが約5.4倍高速化する事がわかる。

CelebAを用いた高解像度画像の生成

本論文で1024×1024の高解像度の画像を生成した結果を下記に示す。

f:id:nogawanogawa:20180528220626j:plain

これらの画像を生成するのに、Tesla V100 GPUを8機使用して、4日計算した。

LSUNの結果

LSUNのBED-ROOMについて、生成画像を比較したものを下記に示す。 f:id:nogawanogawa:20180528220756j:plain

また、下記には別のLSUNカテゴリの図を示す。

f:id:nogawanogawa:20180528221024j:plain

全般的に生成画像の質は高いが、先行研究と大差ない。

実装

著者の方が実際に書いてくれているので、こちらをご参照。

https://github.com/tkarras/progressive_growing_of_gans

コードを眺めるだけならいいけど、実際に計算は勘弁してください。 論文の実装では100万くらいのGPU8機使ってるし、GitHubのREADMEによるとGPUは1000万超えるみたいですし。 ここまでくると一般人では、予算的に実行することすら不可能ですね。

おまけ

書いてる途中で超わかりやすいブログで見つけました。 すごい参考にさせていただきました。 ありがとうございます。

st-hakky.hatenablog.com

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

【実装:StackGAN】StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks

だいぶ前にStackGANの実装をサボっていました。

tsunotsuno.hatenablog.com

理論云々は上の記事を見てもらうとして、実装にフォーカスします。

ネットワークの概念図

StackGAN
ネットワークの概念図

実装サンプル

最近はDefine by runの実行モデルを頭に叩き込むためにpytorchを使うようにしているので今回はPytorchを使います。

Condition Augmentation

ここで結構ハマりました。下記のデータセットを使うと書いてあるんですが、これの使い方がなかなかわかりませんでした。

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

どこかからか持ってきたREADMEを見てみるとこんな感じで書いてあります。

  1. Download our preprocessed char-CNN-RNN text embeddings for birds and flowers and save them to 'Data/'.

    • [Optional] Follow the instructions here to download the pretrained char-CNN-RNN text encoders and extract your own text embeddings.
  2. Download the birds and flowers image data. Extract them to 'Data/birds/' and 'Data/flowers/', respectively.

  3. Preprocess images.

    • For birds: 'python ./misc/preprocess_birds.py'
    • For flowers: 'python ./misc/preprocess_flowers.py'

そんなわけで、とりあえずこのあたりからファイルをダウンロードします。

落として来たら、/Dataの下に落とした.zipファイルを展開・配置します。 今度は

からCUB-200-2011をダウンロードして、これもDataの中に展開・配置します。

この次に前処理なんですが、前処理ししようとしたらこんなエラー。

NameError: name 'xrange' is not defined

どうやら、Python2.xを想定しているらしく、Python3.xで動くように

"xrange" => "range"

に書き換えたら動きました。

改めて中身を見てみると、こんなファイル構成になっていました。

birds
- CUB_200_2011
 - attributes
 - images
  - xxx.画像名
   - 画像名.jpg
 - parts
 - bounding_boxes.txt
 - classes.txt
 - image_class_labels.txt
 - README
 - train_test_split.txt
- test
 - xxx.pickle
- text_c10
 - xxx.画像名
  -画像名.txt
- train
 - yyy.pickle
- example_captions.txt
- readme

見た感じ、学習はtrain/、テストはtest/から使えばいいみたいですね。 さらに中身を見ていくと下のようになっていました。

  • char-CNN-RNN-embeddings.pickle : Textが数値化された10×1024の行列が8855個
  • class_info.pickle : 2-200までの整数が8855個
  • filenames.pickle : ファイル名が8855個

StackGANを実装する上ではEmbedding(Textの数値化したもの)とEmbeddingに対応する画像ファイルが分かれば問題無いはずなので、char-CNN-RNN-embeddings.pickleとfilenames.pickle、画像ファイルがあれば事足りそうです。 (他のファイルは別のことに使うんだと信じてます。間違ってたらごめんなさい。)

Embeddingの概念図
Condition Augmentationの概念図

そんなわけで、char-CNN-RNN-embeddings.pickleを使用して、Condition Augmentationを作ってみます。

Trainer

StackGANの学習の特徴として、前半600epochはStage-Iのみを学習、後半600epochはStage-Ⅱのみを学習します。 そのため、学習は便宜上前半部と後半部を実行時に指定し、どちらの学習かを確認して、該当の学習を実行します。

Stage-Ⅰ

こんな感じでしょうか。

Stage-Ⅱ

実際に動かしてみた結果

こんな感じでした。

64 ×64

f:id:nogawanogawa:20181125152450p:plain

f:id:nogawanogawa:20181125152434p:plain

f:id:nogawanogawa:20181125152416p:plain

256×256

もうだいぶ鳥っぽくなってますね。 ところどころ、「あれっ?」ってなる部分はあるものの、大枠としては鳥に見えそうです。 Stage-IIを100epochくらい回してこんなもんなので、600epochやれば論文みたいにすべて鳥っぽくなりそうですね。

f:id:nogawanogawa:20181120152458p:plain

f:id:nogawanogawa:20181120152518p:plain

f:id:nogawanogawa:20181120152541p:plain

感想

使用するデータセットやらGPU使うための環境だったり、いろいろ手こずりました。 StackGAN自体も結構なコードのボリュームになるので、初めに作った人すごいなあとしみじみ思いました。。。

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がうまく起動しないので、覚えてたらそのうちやります。