スポンサードリンク



こんにちは。sinyです。

最近ディープラーニングのオートエンコーダの学習をしていて、いろいろな種類のオートエンコーダがあることを知ったためmnistデータを使っていろいろと試してみました。

オートエンコーダとは?

オートエンコーダ(AutoEncoder)とは、入力と出力が同じになるようにニューラルネットワークを学習させるような手法です。

オートエンコーダについては、以前以下の記事で解説していますので参考にしてみてください。

ディープラーニングにおけるオートエンコーダの種類

ディープラーニングにおけるオートエンコーダといっても、ネットワークの構成によって様々な種類がありますが、今回は以下の5つの手法をご紹介します。

  • Undercomplete Autoencoder
  • Sparse Autoencoder
  • Deep Autoencoder
  • Convolutional Autoencoder
  • Denoising Autoencoder (DAE)

なお、今回試したサンプルコードはJupyterNotebook形式で以下のGithubにUPしてあります。

https://github.com/sinjorjob/auto_encorder_test

Undercomplete Autoencoder

まず最初は、Undercomplete Autoencoder(不完全なオートエンコーダ)というものですが、これは一般的に説明されているオートエンコーダのことです。

中間層の次元が入力の次元よりも小さくなるようなものをUndercomplete Autoencoderと呼んでいます。

データロードと前処理

x_train 、x_testはそれぞれ(60000, 28, 28) 、(10000, 28, 28)次元のデータになります。

kerasのInput形状に合わせるために入力の形状を(データ数, 28, 28)⇒(データ数, 784) に変形します。

x_train 、x_testはそれぞれ(60000, 784) (10000, 784) 次元のデータになります。

Kerasによるモデルの定義

モデルの定義は以下の通りです。

入力層(784次元)→中間層(32ユニット、relu)→出力層(784次元、sigmoid)という単純な3階層のオートエンコーダモデルです。

学習

kerasのfitメソッドを使って学習を行います。
学習データとテストデータに同じx_trainを与えることで入力と同じデータを出力させるように学習させていきます。

入力画像と出力画像を可視化

最後に入力と出力画像を可視化してみます。

上が入力データ、下が出力データです。
若干薄れている部分がありますが、大体は再現できていることが確認できますね。

Sparse Autoencoder

Sparse Autoencoderは中間層のユニット数が入力層より多いネットワーク構造をしたオートエンコーダです。
中間層に対してペナルティ関数(L1,L2など)を与えることで中間層のユニットの値の大部分を0(情報を伝えない)にすることで過学習を抑える効果があります。

モデルの定義と学習

データの前処理はUndercomplete Autoencoderのケースと同様なので省略します。

モデル定義は以下の通りです。

中間層の定義「activity_regularizer=regularizers.l1(l1))(input_img)」でL1正規化の制約を加えている点が違う点です。

以下の図が学習結果です。

若干薄れている部分がありますが、Sparse Autoencoderでも大体は復元できていることが確認できました。

Sparse Autoencoders場合は指定する正規化パラメータの値によって精度がものすごく変わってくるので最適なパラメータ値を選定することが重要になってくると思います。

以下、3パターンで実験した結果です。

Deep Autoencoder

これまでみてきたAutoencoderはエンコーダ、デコーダの部分だけを考えると中間層が存在しませんが、ここを多層にしたものがDeep Autoencoderです。

データの前処理や学習方法についてはこれまでと全く同様なので省略します。

モデルの定義

入力(784次元)⇒エンコーダ(128⇒64⇒32)→デコーダ(64⇒128⇒784)という形状の多層(ディープ)にした形のネットワーク構成になっています。

以下が学習結果です。

だいぶ鮮明に復元できていることが確認できました。

Convolutional Autoencoder

Convolutional Autoencoderはその名の通りAutoencoderでCNNを使うことにより学習させようというモデルです。

前処理

mnistからロードしたデータをkerasのConv2DモデルのInput形状に合わせるため以下の形状に変形しておきます。

x_train : (60000, 28, 28)  ⇒ (60000, 28, 28, 1)
x_test :  (10000, 28, 28)  ⇒ (10000, 28, 28, 1)

 

 

モデルの定義

 

モデルはエンコーダ部分に畳み込み3回とMaxPooling3回、デコーダ部分に畳み込み4回と
Upsampling3回で最後にシグモイド関数を指定しています。

形状は、入力が(28,28,1)、最終的な出力も(28,28,1)になるようなネットワークモデルになっています。

 

モデルのsummaryは以下の通りです。

 

 

学習

学習はこれまでと同じように行います。

以下が学習結果です。

CNNを使ったオートエンコーダもかなり鮮明に再現できていることが確認できました。

 

Denoising Autoencoder (DAE)

最後に試したのは、Denoising Autoencoder (DAE)と呼ばれるモデルです。

これは、ノイズ除去エンコーダとも呼ばれるもので、入力データに意図的にノイズを加えるモデルになっています。

ノイズが加わった入力からオリジナルの入力を復元しないといけないので、単純に値をコピーするわけにはいかなくなることで、精度の高い復元性を実現しようというようなモデルのようです。

前処理

まず、正規分布のノイズを加え、0から1の間の値を取るようにクリップします。

入力データの形状は以下の通りです。

x_train_noisy : (60000, 28, 28, 1)
x_test_noisy :  (10000, 28, 28, 1)

上記コードの補足説明
  • 平均:50, 標準偏差:10 の正規分布に従う乱数を 10 件出力する例

     np.random.normal(50, 10, 10)
     numpy.random.normal(loc=0.0, scale=1.0, size=None)

  • loc:平均 scale:標準偏差
  • np.clip (配列、min, max)

    配列の要素を範囲内に収めるように修正してくれる。
    n.clip(配列、0., 1.)で0以下を0に1を超えるものを1に修正する効果がある。

 

ノイズを加えた画像をチェック

ちゃんとノイズが加わっているかどうか入力画像をチェックしてみます。

以下の通り、ノイズが加わった入力画像データになっていることが確認できました。

モデルの定義

 

モデルの定義自体は、先ほどのCNNモデルの場合と同じような構成になっています。

 

 

学習


ノイズを加えた画像を入力、ノイズのないオリジナルの画像をラベルとして学習させます。

以下が学習結果です。

かなり鮮明に復元できていることが確認できました。

まとめ

 

  • オートエンコーダによる異常検知にも様々なモデルがある。
オートエンコーダの種類
  • Undercomplete Autoencoder
  • Sparse Autoencoder
  • Deep Autoencoder
  • Convolutional Autoencoder
  • Denoising Autoencoder (DAE)
  • Sparse Autoencoderは指定する正規化パラメータによって精度が大きくぶれる。
  • エンコーダ、デコーダ層をディープ(複数階層)にすると精度向上が見込める。
  • 画像系の異常検知にはCNNモデルのオートエンコーダを使ったほうがよさそう。
  • Denoising Autoencoder (DAE)はノイズを加えることで精度の高い復元モデルの構築ができそう。

今回は、単純なMNISTデータを利用しただけなので何とも言えませんが、いろんなケースで検証することでどのようなデータの場合にどのオートエンコーダモデルが適しているかといった特徴、傾向を探っていきたいと思います。

以上、様々なオートエンコーダによる異常検知でした。

おすすめの記事