note.nkmk.me

KerasでMNISTを分類(ソフトマックス編)

Date: 2017-08-20 / tags: Python, Keras, 機械学習
スポンサーリンク

Pythonの深層学習ライブラリ、Keras

Kerasは、バックエンドにTensorFlowやTheanoを利用したPythonの深層学習ライブラリ。

Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです.
Keras Documentation

日本語のドキュメントが充実しており、とっつきやすい。

TensorFlowで書いたソフトマックス回帰によるMNISTの分類をKerasで書き直してみる。TensorFlow版は以下の記事。

今回のコードは以下に置いてある。

訓練データとテストデータを準備

データの準備はTensorFlowのときと同じ。KerasにもMNISTデータセットを読み込む関数があるが、ここでは、scikit-learnを使って別途準備している。

import numpy as np
from sklearn import datasets, model_selection
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
# Using TensorFlow backend.

mnist = datasets.fetch_mldata('MNIST original', data_home='data/src/download')

X = mnist.data / 255
y = mnist.target
Y = np.identity(10)[y.astype(int)]

train_size = 60000
test_size = 10000

X_train, X_test, Y_train, Y_test = model_selection.train_test_split(
    X, Y, test_size=test_size, train_size=train_size)

画像データは255で割って0〜1に規格化し、正解ラベルはnumpy.identity()でone-hot表現に変換している。

モデルの構築

Kerasの真価が発揮されるのはここから。TensorFlowでは結構面倒くさかったモデルの構築がものすごく簡単。

model = Sequential()
model.add(Dense(units=10, input_dim=784, activation='softmax'))
sgd = optimizers.SGD(lr=0.5)
model.compile(
    optimizer=sgd,
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

Sequentialモデルに.add()メソッドで層を追加していくだけ。ここでは全結合層Dense()に活性化関数としてソフトマックスを指定しているので1層だけだが、多層のモデルの場合はさらに層を追加すればOK。

モデルを定義し終わったら、.compile()メソッドで、

  • 最適化アルゴリズム
  • 損失関数
  • 評価関数

を指定する。基本的なアルゴリズムや関数は準備されているのでそれを選ぶだけでいい。

訓練

訓練を行うのも簡単。訓練用データとエポック数、バッチサイズを指定して.fit()メソッドを呼ぶだけ。

batch_size = 100
epochs = 20

model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size)

実行すると、損失関数と評価関数に基づいて学習の進行状況がリアルタイムで出力される。

# Epoch 1/20
# 60000/60000 [==============================] - 1s - loss: 0.3934 - acc: 0.8884     
# Epoch 2/20
# 60000/60000 [==============================] - 1s - loss: 0.3018 - acc: 0.9145     
# Epoch 3/20
# 60000/60000 [==============================] - 1s - loss: 0.2870 - acc: 0.9192     
# Epoch 4/20
# 60000/60000 [==============================] - 1s - loss: 0.2793 - acc: 0.9212     
# Epoch 5/20
# 60000/60000 [==============================] - 1s - loss: 0.2739 - acc: 0.9235     
# Epoch 6/20
# 60000/60000 [==============================] - 1s - loss: 0.2699 - acc: 0.9242     
# Epoch 7/20
# 60000/60000 [==============================] - 1s - loss: 0.2666 - acc: 0.9252     
# Epoch 8/20
# 60000/60000 [==============================] - 1s - loss: 0.2645 - acc: 0.9251     
# Epoch 9/20
# 60000/60000 [==============================] - 1s - loss: 0.2621 - acc: 0.9269     
# Epoch 10/20
# 60000/60000 [==============================] - 1s - loss: 0.2601 - acc: 0.9280     
# Epoch 11/20
# 60000/60000 [==============================] - 1s - loss: 0.2588 - acc: 0.9274     
# Epoch 12/20
# 60000/60000 [==============================] - 1s - loss: 0.2586 - acc: 0.9277     
# Epoch 13/20
# 60000/60000 [==============================] - 1s - loss: 0.2558 - acc: 0.9285     
# Epoch 14/20
# 60000/60000 [==============================] - 1s - loss: 0.2547 - acc: 0.9287     
# Epoch 15/20
# 60000/60000 [==============================] - 1s - loss: 0.2537 - acc: 0.9297     
# Epoch 16/20
# 60000/60000 [==============================] - 1s - loss: 0.2526 - acc: 0.9288     
# Epoch 17/20
# 60000/60000 [==============================] - 1s - loss: 0.2524 - acc: 0.9287     
# Epoch 18/20
# 60000/60000 [==============================] - 1s - loss: 0.2515 - acc: 0.9298     
# Epoch 19/20
# 60000/60000 [==============================] - 1s - loss: 0.2499 - acc: 0.9303     
# Epoch 20/20
# 60000/60000 [==============================] - 1s - loss: 0.2499 - acc: 0.9302     

評価

評価は.evaluate()メソッド。テスト用のデータを指定する。損失関数と評価関数に基づいた結果が帰ってくる。

score = model.evaluate(X_test, Y_test)
print(score)
# 10000/10000 [==============================] - 0s     
# [0.30260467473864555, 0.91790000000000005]

結果は92%弱。当然ながらTensorFlowで実装したときと同じレベルの学習結果になっている。

Kerasでの学習の流れ

Kerasでの学習の流れをまとめると以下のようになる。

  1. Sequential()でモデルを構築
    • .add()メソッドで層を追加していく
  2. .compile()メソッドで学習処理を設定
  3. .fit()メソッドで訓練
  4. .evaluate()メソッドで評価

いろいろと面倒なTensorFlowよりも格段にシンプルに書ける。素敵です。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事