Gakushukun1’s diary

20代エンジニア, 統計的機械学習勉強中 twitter: @a96665004

fashion-mnistにAutoencoderを適用してみる

目的

fashion-mnistにAutoencoderを適用し, 画像データがどのようにエンコードされているかを調べる.


今回は, fashion-mnistデータセットに対してAutoencoderを適用してみた. fashion-mnistはデータセット - Keras Documentationにも書かれているように, 28x28のサイズの服や靴といったファッション関連の画像を60000枚集めたデータセットである. 各データは10種類のラベルのうちのいずれかに分類される. それぞれのラベルを持つデータの代表例を挙げる.
f:id:gakushukun1:20190518144104p:plain

左上から

  • (0) Tシャツ/トップス
  • (1) ズボン
  • (2) プルオーバー
  • (3) ドレス
  • (4) コート
  • (5) サンダル
  • (6) シャツ
  • (7) スニーカー
  • (8) バッグ
  • (9) アンクルブーツ

に属するデータセットの一例である.

これらを含む600000枚のデータセットのうち, 半分の30000枚を使ってAutoencoderの学習を行う. 実際に学習に使ったネットワークの構造は次の通り.

f:id:gakushukun1:20190518144615p:plain

f:id:gakushukun1:20190518144636p:plain

エンコーダー側は入力が28x28=784次元, 中間層が50次元, 出力が5次元であり, デコーダーはそれを反転させた構造を持つ. 学習の際には, エンコーダーデコーダーを繋げて, もとの入力になるべく近い情報を出力するよう結合の重みを変えていく.

学習後に, 残りの30000枚のデータのうち, 10種類のラベルそれぞれに属しているデータをAutoencoderに通してみると, 次のように元の出力をある程度再現できていることが分かる. (各行1, 3番目の画像が元データ, 各行2, 4番目の画像が Autoencoderを通した画像)
f:id:gakushukun1:20190518171720p:plain

また, 30000枚のテストデータ全てについてエンコーダーに通し,その出力(5次元の情報)を各ラベルごとに平均をとった結果をデコーダーに通すと次のようになった.
f:id:gakushukun1:20190518175334p:plain

おおむね元のラベルが示す物の画像が出力されていることが確認できる. さらに, 前述したエンコーダーの出力を各ラベルごとに平均をとったものに対して, 5次元ある情報のうち1次元だけを0に変えてからデコーダーに渡す実験を行った. 得られた出力は次のようになる.
f:id:gakushukun1:20190518213916p:plain

縦の表示'input[i] == 0'は, デコーダーに渡したラベル0~9それぞれの平均ベクトル全てに対し, i番目の値だけ0に変えたことを意味する. この方法を用いることで, デコーダーの入力の各次元がどのような役割を担っているかを知ることができる.
i=0番目を0にする(図の1行目)と, 靴(サンダル, スニーカー, アンクルブーツ)かバッグを表していることが分かる. i=1番目を0にする(図の2行目)と, ズボン, プルオーバー, スニーカーを表していることが分かる. i=2番目を0にする(図の3行目)と, シャツ, プルオーバー, サンダルを表していることが分かる. i=3番目を0にする(図の4行目)と, シャツ, ズボン, プルオーバー, バッグを表していることが分かる. i=4番目を0にする(図の4行目)と, すべての図がぼやけ, どれともいえない画像となる.

Autoencoderは, このように情報を圧縮し, その組み合わせで画像を復元しているようだ.

まとめ

fashion-mnistを用いて, Autoencoderによる画像の符号化, 復号化の性質を調べた.