唐突にKerasを始める

唐突ですが、ここしばらくはニューラルネットワークを使った学習にKerasを使っていこうと思います. Google Colaboratoryですぐ使えるということと、非常に使いやすそうだという安易な理由です.

Kerasについて

以前どこかの記事で触れましたがKerasはTensorFlowのラッパーです.

そのため、まずTensorFlowの説明が必要になるのですが、今更詳細に書くようなことでもないのでさくっと書きます.

  • TensorFlowは、多次元配列を流すという名前が示すように、NNを使った機械学習、深層学習が行えるライブラリ
  • TensorFlowによって、ゼロからネットワーク構造を記述しなくても、簡単に多層NNを使った機械学習が行えるようになった.

そして、TensorFlowを使うのすら簡単にしてしまうために開発されたものがKerasになります。

よく言われるメリットとして、 直感的な記述でネットワークを記述できる、ほんの数行でネットワークを実装できることなどが挙げられます.ただし、TensorFlowの機能を使いやすくしたものであるので、そもそもTensoFlowにできないことはできません.


私なりにKerasのことをかみ砕いた結果、TensorFlowのことを無茶苦茶詳しく知っている下請け会社のようなものかと思ったんですが、余計分かりにくいですね.やっぱり、なんかTensorFlowを使いやすくしたやつ、という認識でいいんじゃないかと思います.

今回の目標

Colaboratory上のnoteはコチラ


必要なライブラリのインポート

省略

疑似データセットの作成

-1から1の範囲の適当な3次元のデータを入力として、その積が正なら1, 負なら0と判定するNNを実装していきます.
この関数には微塵も意味はありません.

# 入力データの作成
X = 2*np.random.rand(300,3) -1

# prodでリスト内の積を計算
# まずBool値を返し、Trueなら1,Falseなら0を返す
y = (np.prod(X, axis = 1) > 0)*1

# 正解ラベルを2次元配列に変換する
# 1 なら [1, 0]
# 0 なら [0, 1]
y = np_utils.to_categorical(y)


Kerasを使ったニューラルネットの構築

Kerasでネットワークを構築するときは、モデルSequentialを使います.

Sequentialでは層をaddで足していくことができます.Activatte Function、Dropoutなども層として扱うことになります.

今回は中間層2層(入力層1・隠れ層2・出力層1)としています。(1層だとうまくいかなかったので)

# モデルの定義
model = Sequential()

こんな感じでレイヤーを足していくことができます.

model.add(Dense(20, input_dim=3))
model.add(Activation("relu"))


Compile

Kerasでは、学習(fit)とは別にcompileを行います.学習で使う最適化手法や、損失関数(Loss)なんかはここで決めるので、学習の前に行います.

compileにおける引数は

  • loss :使用する損失関数(詳細はこちら
    • categorical_crossentropy, binary_crossentropyなど
  • optimizer:最適化に用いる方法(詳細はこちら
    • SGD, RMSprop, Adagrad, Adadelta, Adamなど
  • metrics:評価関数
    • metrics=['accuracy']でOKということでしょうか.(ドキュメントの日本語訳が少し不思議)、自分で定義した関数を関数として与えることもできるらしい

評価関数のリスト: 分類問題では精度としてmetrics=['accuracy']を指定したくなるでしょう.

model.compile(optimizer = "Adam",
                   loss = "binary_crossentropy",
                 metrics=["accuracy"])


学習(fitを用いる)

学習はscikit-leranと同じくfitで行うことができます.
引数は入力および正解データの他、

  • epochs:エポック数
  • validation_split:入力データのうち、何割を検証に利用するか
  • verbose:学習経過の表示

などを指定できます.詳細はこちら

model.fit(X, y, epochs=300, validation_split=0.2, verbose = 2)


テストデータに対する確認

今回はデータの作り方が分かっているので、テストデータはあらためて作成しています.
なお、検証データとテストデータは異なるので注意してください.

中間層が1層だと精度が80%前後と精度は良くなかったので、2層にしてみると90%前後になりました.他にも最適化手法とかをいじれば改善できると思うんですが、今回はやめておきます.

ただ、中間層を2層にするのはおそろしく簡単でした.


公式ドキュメントにサンプルが充実しているという話

公式のSequentialモデルガイドには、役立ちそうなサンプルがたくさん載っています


基本的にコピぺで流すことができると思いますが、そのままだと精度は出ないようになっています.epoch数が少ないから?


結論

まだ、表面をなでただけですが、Kerasって手軽すぎる・・という印象です.
この勢いで、いろいろ試していきたいと思います.


今回、参考にしたのは以下の2つの記事になります.ありがとうございます.

Kerasの導入から実施まで丁寧にまとめられています.

qiita.com

引数とかで困ったらやはり公式ドキュメントです

Sequentialモデルのガイド - Keras Documentation