KerasでDeep Learning:とりあえずネットワークを組んでみる
データセット
人工的に乱数を振って作成したものを用います。
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
今回はちょこざいなデータを使いましたが、もう少しまともなデータを使って勉強していこうと思います。