機械学習

新基準となるか?カプセルネットワーク(CapsNet)をKeras で構築してMNISTをやってみました

  • このエントリーをはてなブックマークに追加

従来のニューラルネットワークを超えるとまで言われている、最新鋭のアルゴリズム「カプセルネットワーク」。人工知能・機械学習をやっている方であれば、末に耳にした方も多いかと思います。

年末年始のお休みでCapsNetを紐解いてみようとお考えの方も多いはず!本記事では「速報」として、カプセルネットワーク(CapsNet)の簡単な概要、さらにはKeras(TensorFlow Backend)を使ってCapsNetの構築を行い、MNISTの結果を確認するチュートリアルとなります。(参考ソース:こちら

CapsNetの論文(英語)を紐解く前に、まずはコードを一緒に動かしてみましょう!

カプセルネットワーク(CapsNet)とは?

Googleに所属する天才AI研究者「ジェフ・ヒントン」が生み出した、「ニューラルネット」を超える可能性がある新しい深層学習のアルゴリズムです。

ジェフ・ヒントンですが、現在はGoogleとトロント大学で働いており、既に人工知能・機械学習のスタンダードとなりつつある「ニューラルネットワーク」を生み出した研究者の一人でもあります。そんな天才が約40年もの年月を費やして考え発表したのが「カプセルネットワーク」です。

カプセルネットワークの概要の前に、まずはCNN(畳み込みニューラルネットワーク )の理解が必要です。CNNですが、機械学習の画像を扱うアルゴリズムで、画像の解析を行う際に最も頻繁に使われるアルゴリズムです。人工知能の技術でよく騒がれる、自動車の自動運転や工場での検品など、画像を扱う多くの場合で、このCNNが使われていました。

CNNですが非常に優れたアルゴリズムですが、それでも克服しなくてはいけない弱点がありました。その弱点を克服したのが、この新しいカプセル・ネットワークとなります。

より詳しいカプセルネットワークの説明は、下記のリンクをご参考ください!(特に最後のYouTubeがシンプルで非常にわかりやすかったです。)

では、今回の記事の目的でもある、CapsNetをKerasを使ってに構築してみましょう。

チュートリアルの概要

本チュートリアルの概要や環境のバージョンなどをまとめています。あくまで、CapsNetを全て理解するという趣旨ではなく、まずは手っ取り早く実際に構築してみて、触ってみたいという方向けのチュートリアルとなります。

概要
カプセル・ネットワーク(CapsNet)をKeras(TensorFlow Backend)を使って構築して、MNIST(手書き数字データセット)の結果をみてみます。実行環境はJupyter Notebookを使用しています。

必要な時間
1時間〜3時間程度

実行環境

  • macOS High Sierra 10.13.1
  • プロセッサ 2.4GHz Intel Core i5
  • メモリ 8GB
  • Python 3.6.1
  • Numpy 1.12.1
  • Matplotlib 2.0.2
  • iPython 6.2.1
  • Keras 2.1.2
  • TensorFlow 1.4.1

チュートリアルの流れ

  1. カプセル層の作成
  2. モデル構築
  3. MNISTデータの読み込み
  4. 結果確認

では、早速、Jupyter Notebookを立ち上げてやってみましょう。

カプセル層の作成

kerasとTensorFlowを使ってカプセルネットワークのレイヤーを作成します。まずは必要なライブラリをインポートしていきましょう。

まずはベクトルの長さを計算する処理です。margin_lossのy_trueと同じサイズのテンソルを計算します。

  • 入力 : shape = [dim_1, …, dim_{n-1}, dim_n}
  • 出力 :shape = [dim_1, …, dim_{n-1}}
次にテンソルをマスクするクラスの作成です。
次が非線形の活性化関数「squash」を作りましょう。計算式ですが、下記となります。より詳しく調べてみたい方は、冒頭で触れましたが論文または説明動画をお勧めいたします。基本的に大きなベクトルをほぼ1へ、小さいベクトルをほぼ0として処理をします。

さて、いよいよカプセルレイヤー(カプセル層)の作成をします。デンスレイヤーと似ています。デンスレイヤーでは、インプットをスカラーのin_num(一つ前の層の出力ニューロン)として、アウトプットはout_num(出力ニューロン)でした。カプセルネットワークも似たような構造ですが、出力ニューロンがスカラーではなく、ベクトルの部分が異なります。

カプセルネットワークの入出力
インプットのサイズ:[None, input_num_capsule, input_dim_vector] アウトプットのサイズ:[None, num_capsule, dim_vector]

パラメーター
num_capsule:レイヤーのカプセル数
dim_vector:レイヤーのカプセルベクトルの出力のディメンション
num_routing:ルーティングアルゴリズムの反復回数

これでカプセル層の作成は完了です!次のステップへいきましょう。

モデル構築

さて、次は前項で作成した層を使ってモデルの構築を行いましょう。カプセルネットワークのモデルですが、一般的なX → yと少々異なり、(X, y) → (y, X)となっています。この方法ですが、cGAN(Conditional Generative Adversarial Nets)と似ていています。

次にマージンロスの処理を作ります。

さて、最後にモデルの宣言をしましょう。最後にモデルの概要をプリントして確認してみます。

これでCapsNet(カプセルネットワーク)の構築が完了です!次はMNISTのデータを読み込んで、訓練をしてみましょう!

MNIST読み込み&カプセルネットワークの訓練

いよいよMNISTのデータを読み込んで、カプセルネットワークのトレーニングを行います。MNISTのデータをお持ちでない方は、Kaggle MNISTデータからダウロードをお願いします。(Kaggleへの無料会員登録が必要です。参考:Kaggleとは

では、早速データを読み込んで、train_test_splitを使ってテストデータと訓練データに分けてあげましょう。

次にデータ型と簡単な事前処理を行います。

いよいよCapsNet(カプセルネットワーク)のトレーニングの処理を書きましょう。

さて、これで全ての準備が整いました!いよいよ、MNISTのデータをカプセルネットワークでトレーニングしてみましょう!私の環境(Mac、 Core i5、8GBRAM)で30分程度かかりました。GPUが欲しい・・・。

これでCapsNetのトレーニングが完了です。次はいよいよデータを渡して精度を確認してみましょう。

CapsNetの精度を確認してみよう

MNISTの予測をする前に、テストとMNIST画像を簡単に処理する関数を作っておきましょう。テストデータでの精度(Accuracy)、さらにx_testとx_reconの画像をプロッティングしてみましょう。

では、テスト用データの最初の100件を使って訓練したCapsNetのテストを行ってみましょう!新しいアルゴリズムを確認するのって、ワクワクしますよね(笑)

精度が0.97!驚くほど高い精度ですね!

CapsNet(カプセルネットワーク)まとめ

いかがでしたでしょうか?今回はKerasを使って実際にCapsNet(カプセルネットワーク)の構築、さらにはMNISTのデータセットでテストを行ってみました。個人的にも、まだまだ紐解きが必要な部分が多数ありますので、今回を皮切りに論文などを読み漁ってみようかと思いました!

機械学習初心者向けのハンズオンチュートリアルを多数掲載しています。今回はMNISTを使って画像の処理でしたが、基本的なランダムフォレストやXGBoostなどのチュートリアルも掲載していますので、興味のある方はぜひ下記のチュートリアルもやってみてください!

以上、最新アルゴリズム「カプセルネットワーク(CapsNet)」の速報チュートリアルでした!

 

  • このエントリーをはてなブックマークに追加

無料で始める機械学習エンジニア入門

AIエンジニアへスキルアップをしませんか?コデクサでは、機械学習の初心者を対象に0から学べるコースを配信しています。

機械学習に必要な線形代数や統計基礎、さらに初歩的なアルゴリズムなどの無料コースを豊富に取り揃えています!

機械学習エンジニアへキャリアアップをしましょう!

コースを確認する

コメント

  1. 小林 より:

    上記コードはgitあたりで公開されていますか?上記の通り実装しようとしているのですが、うまくいかず元コードがあれば確認したいと思っています。

小林 へ返信する コメントをキャンセル

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)