データサイエンティスト(仮)

元素粒子論博士。今はデータサイエンティスト(仮)。

KerasでDeep Learning:とりあえずネットワークを組んでみる

導入

前回はKerasを導入しました。
tekenuko.hatenablog.com

今回は、実際にネットワークを組んで学習をさせてみようと思います。簡単すぎるような気がしますが一歩ずつ…。

データセット

人工的に乱数を振って作成したものを用います。

import numpy as np
# 784次元のベクトルを1000個生成、成分は一様乱数
data = np.random.random((1000, 784))
# 0-9の数値をランダムに1000個生成
labels = np.random.randint(10, size=(1000, 1))

Kerasでは、ラベルはone-hot encoding(一つの成分が1で、他は0の列)で表す必要があります。必要なメソッドインポートして変換します。

from keras.utils.np_utils import to_categorical
labels = to_categorical(labels, 10) 

ネットワーク作成

実際にちょこざいなネットワークを構築してみます。Kerasのよいところの一つに、ネットワーク作成部分が容易かつ分かりやすいということがあります。書き方ですが、大きく2通りあるようなので、同じネットワークと2通りの方法で書いてみます。

Sequentialモデル

入力層から順繰りレイヤーを足していくような書き方をするものです。まず、今回必要なライブラリをインポートします。

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()で初期化し、model.add()でネットワークを足していきます。

model = Sequential()
model.add(Dense(64, activation='relu', input_shape = (784, )))
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

ネットワークの次元や活性化関数は以下です。

  • 1層目:全結合、入力784次元、出力64次元、活性化関数ReLU
  • 2層目:全結合、入力64次元、出力64次元、活性化関数ReLU
  • 2層目:全結合、入力64次元(たぶん)、 出力10次元、活性化関数SoftMax

活性化関数は以下のものを使用できます。

  • softplus
  • softsign
  • relu
  • tanh
  • sigmoid
  • hard_sigmoid
  • linear

より高度な活性化関数は、Advanced Activations Layers - Keras Documentationを参照ください。例えば、leaky_reluを使いたい場合は

from keras.layers.advanced_activations import LeakyReLU
leaky_relu = LeakyReLU()

などとしてactivation=leaky_reluとします。

モデルのコンパイルをmodel.compileで行います。

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

暗にいくつかデフォルトの引数を使っていますが、指定できるオプションは例えば以下です。

  • loss : 損失関数
    • mean_squared_error : 二乗誤差
    • mean_absolute_error : 絶対誤差
    • mean_absolute_percentage_error, make : 正解とのズレ(絶対値)の割合
    • mean_squared_logarithmic_error, msle : 正解とのズレ(二乗誤差)の割合
    • squared_hinge : マイナスのところは0, プラスは二乗誤差
    • hinge : マイナスのところは0, プラスは絶対値
    • binary_crossentropy : logloss
    • categorical_crossentropy : マルチクラスlogloss
    • sparse_categorical_crossentropy : スパースラベルを取る categorical_crossentropy
    • kullback_leibler_divergence, kld : 分布の距離(的なもの)
    • poisson : 予測-正解*log(予測)の平均
    • cosine_proximity : 予測と正解間のコサイン近似の負の平均
  • optimizer : 最適化関数
    • SGD
    • RMSprop
    • Adagrad
    • Adadelta
    • Adam
    • Adamax
    • Nadam
    • TFOptimizer
  • metrics : 評価指標
    • 一般にはmetrics=['accuracy']を使う

細かいのは他にもありますが、それはModelクラス (functional API) - Keras Documentationを参照ください。

学習はmodel.fit()で行います。

model.fit(x = data, y = labels)

オプション(一部)は以下です。より詳細はModelクラス (functional API) - Keras Documentationを参照ください。

  • x : 説明変数
  • y : 目的変数
  • batch_size : ミニバッチのサイズ
  • epochs : 同じデータで何回繰り返し学習するか、デフォルトは10
  • validation_split : 各epochで学習データの何パーセントをvalidation用データにするか

実行すると以下のものが出力されます。

Epoch 1/10
1000/1000 [==============================] - 0s - loss: 2.7473 - acc: 0.0970     
Epoch 2/10
1000/1000 [==============================] - 0s - loss: 2.3096 - acc: 0.0920     
Epoch 3/10
1000/1000 [==============================] - 0s - loss: 2.3065 - acc: 0.1100     
Epoch 4/10
1000/1000 [==============================] - 0s - loss: 2.2989 - acc: 0.1260     
Epoch 5/10
1000/1000 [==============================] - 0s - loss: 2.2863 - acc: 0.1310     
Epoch 6/10
1000/1000 [==============================] - 0s - loss: 2.2813 - acc: 0.1290     
Epoch 7/10
1000/1000 [==============================] - 0s - loss: 2.2456 - acc: 0.1590     
Epoch 8/10
1000/1000 [==============================] - 0s - loss: 2.2265 - acc: 0.1990     
Epoch 9/10
1000/1000 [==============================] - 0s - loss: 2.3623 - acc: 0.2040     
Epoch 10/10
1000/1000 [==============================] - 0s - loss: 2.2957 - acc: 0.2300

はい。。乱数を生成させて作ったデータなので、精度もへったくれもないです。

Functional API

こちらは、浅いネットワーク層の結果を次のネットワーク層の引数に渡してつないでいくイメージです。Chainerに近いかも。

# 必要なライブラリ
from keras.layers import Input, Dense
from keras.models import Model

こちらの場合は、以下のようにModelメソッドにin/outを入れるように書きます。

inputs = Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)
model = Model(inputs=inputs, outputs=predictions)

あとはSequentialの場合と同様、Modelのcompile、fitメソッドを使ってモデルをコンパイルして学習しますが、似たような感じなので省略します。ただし、こちらのfitメソッドのepoch数のデフォルトは1のようです。

感想

あまりコードを書かなくてもネットワークを構築して学習できるため、非常に便利だなと感じました。とりあえずざっくり分析したいときはKerasを使うと手早く分析できそうです。細かいことが気になったときはどうなのかはおいおい調べていくということで。

Next Step

今回はちょこざいなデータを使いましたが、もう少しまともなデータを使って勉強していこうと思います。