最近ディープラーニングのオートエンコーダの学習をしていて、いろいろな種類のオートエンコーダがあることを知ったためmnistデータを使っていろいろと試してみました。オートエンコーダとは?オートエンコーダ(AutoEncoder)とは、入力と出力が同じになるようにニューラルネットワークを学習させるような手法です。オートエンコーダについては、以前以下の記事で解説していますので参考にしてみてください。ディープラーニングで簡単な時系列データの異常検知2019.6.8こんにちは。昨年G検定に合格してからも、少しずつですがディープラーニングの勉強も継続しています。業務経験ゼロなので偉そうなことは全く言えないのですが、最近受講したディープラーニングを用いた異常検知セミナーの知識を使って、実際に業務に生かせる領域がないかちょっとだけ探ってみましたので...ディープラーニングにおけるオートエンコーダの種類ディープラーニングにおけるオートエンコーダといっても、ネットワークの構成によって様々な種類がありますが、今回は以下の5つの手法をご紹介します。(DAE)なお、今回試したサンプルコードはJupyterNotebook形式で以下のGithubにUPしてあります。Autoencoder(不完全なオートエンコーダ)というものですが、これは一般的に説明されているオートエンコーダのことです。Autoencoderと呼んでいます。28)次元のデータになります。次元のデータになります。Kerasによるモデルの定義モデルの定義は以下の通りです。loss='binary_crossentropy')入力層(784次元)→中間層(32ユニット、relu)→出力層(784次元、sigmoid)という単純な3階層のオートエンコーダモデルです。学習kerasのfitメソッドを使って学習を行います。学習データとテストデータに同じx_trainを与えることで入力と同じデータを出力させるように学習させていきます。最後に入力と出力画像を可視化してみます。#軸の値の表示を無効化plt.show()上が入力データ、下が出力データです。若干薄れている部分がありますが、大体は再現できていることが確認できますね。Autoencoderは中間層のユニット数が入力層より多いネットワーク構造をしたオートエンコーダです。中間層に対してペナルティ関数(L1,L2など)を与えることで中間層のユニットの値の大部分を0(情報を伝えない)にすることで過学習を抑える効果があります。Autoencoderのケースと同様なので省略します。モデル定義は以下の通りです。中間層の定義「activity_regularizer=regularizers.l1(l1))(input_img)」でL1正規化の制約を加えている点が違う点です。x_test))以下の図が学習結果です。Autoencoderでも大体は復元できていることが確認できました。Autoencoders場合は指定する正規化パラメータの値によって精度がものすごく変わってくるので最適なパラメータ値を選定することが重要になってくると思います。以下、3パターンで実験した結果です。Autoencoderです。データの前処理や学習方法についてはこれまでと全く同様なので省略します。入力(784次元)⇒エンコーダ(128⇒64⇒32)→デコーダ(64⇒128⇒784)という形状の多層(ディープ)にした形のネットワーク構成になっています。x_test))以下が学習結果です。鮮明に復元できていることが確認できました。Autoencoderはその名の通りAutoencoderでCNNを使うことにより学習させようというモデルです。前処理mnistからロードしたデータをkerasのConv2DモデルのInput形状に合わせるため以下の形状に変形しておきます。28,1))print(x_train.shape)print(x_test.shape)モデルの定義モデルはエンコーダ部分に畳み込み3回とMaxPooling3回、デコーダ部分に畳み込み4回とUpsampling3回で最後にシグモイド関数を指定しています。形状は、入力が(28,28,1)、最終的な出力も(28,28,1)になるようなネットワークモデルになっています。decoded)モデルのsummaryは以下の通りです。学習はこれまでと同じように行います。x_test),)以下が学習結果です。CNNを使ったオートエンコーダもかなり鮮明に再現できていることが確認できました。(DAE)と呼ばれるモデルです。これは、ノイズ除去エンコーダとも呼ばれるもので、入力データに意図的にノイズを加えるモデルになっています。ノイズが加わった入力からオリジナルの入力を復元しないといけないので、単純に値をコピーするわけにはいかなくなることで、精度の高い復元性を実現しようというようなモデルのようです。前処理まず、正規分布のノイズを加え、0から1の間の値を取るようにクリップします。(60000,1,28,28)の平均0、標準偏差1のデータにnoise_factorを足したものをx_trainに足してノイズを加える。(60000,1,28,28)の平均0、標準偏差1のデータにnoise_factorを足したものをx_trainに足してノイズを加える。1.)入力データの形状は以下の通りです。max)配列の要素を範囲内に収めるように修正してくれる。1.)で0以下を0に1を超えるものを1に修正する効果がある。ノイズを加えた画像をチェックちゃんとノイズが加わっているかどうか入力画像をチェックしてみます。28))plt.gray()ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)plt.show()以下の通り、ノイズが加わった入力画像データになっていることが確認できました。モデルの定義モデルの定義自体は、先ほどのCNNモデルの場合と同じような構成になっています。0学習ノイズを加えた画像を入力、ノイズのないオリジナルの画像をラベルとして学習させます。x_test),)以下が学習結果です。鮮明に復元できていることが確認できました。まとめオートエンコーダによる異常検知にも様々なモデルがある。Autoencoderは指定する正規化パラメータによって精度が大きくぶれる。エンコーダ、デコーダ層をディープ(複数階層)にすると精度向上が見込める。画像系の異常検知にはCNNモデルのオートエンコーダを使ったほうがよさそう。(DAE)はノイズを加えることで精度の高い復元モデルの構築ができそう。今回は、単純なMNISTデータを利用しただけなので何とも言えませんが、いろんなケースで検証することでどのようなデータの場合にどのオートエンコーダモデルが適しているかといった特徴、傾向を探っていきたいと思います。以上、様々なオートエンコーダによる異常検知でした。WEBアプリ開発コース|siny|notehttps://note.mu/shinya_hd/m/m7c72d8925919以下のコースをまとめた割引プランです。¥500¥1,500相当のチュートリアルを、セット割で¥1,000で販売します。Dj...FacebookTwitterGoogle+はてブPocketFeedlyこの記事を書いた人siny現在の仕事は社内SEのお仕事です。趣味でDjango,Python,機械学習、ディープラーニングなどをやってます。学習済みCNNモデルの利用方法まとめ【ディープラーニング】おすすめの記事Django爆速で作れるDjangoユーザ認証機能【django-allauth】こんにちは。最近、改めてDjango認証回りの勉強をしているのですが、Django標準である程度認証機能が付属しているとはい...Django【事例紹介】Django+IISのPOSTリクエストでタイムアウト発生こんにちは。今回は、Django+IIS環境で発生したタイムアウト問題に関する情報を簡単にまとめました。チュートリアルを日本語化してみましたこんにちは。L...DjangoDjangoのModelデータをバックアップする方法こんにちは。本記事ではDjangoでModelデータの情報をCSV形式でバックアップする方法についてご紹介します。モデルク...DeapLearning【ディープラーニング入門】4つの例で学ぶスカラ、ベクトル、テンソルこんにちは。先日、G検定に合格したのですが、改めて基礎知識について復習をしていてスカラー、ベクトル、テンソルの考え方がややこ...DeapLearningディープラーニング+Djangoで言語翻訳デモアプリの作成【前編】こんにちは。この記事では、ディープラーニングのSeq2seqを使った簡単な英語→日本語翻訳アプリをDjangoで実装する方法...DjangoDjangoでテーブルの履歴管理機能を実装する方法こんにちは。この記事ではDjangoのモデルで実装したテーブルの履歴管理機能を実装する方法をご紹介します。テーブルの履歴情...DeapLearning自然言語処理(NLP)でできることとは?【入門者向け】こんにちは。