【Python】MNISTを自作ニューラルネットで学習させる方法。

Python

今回の記事はPython機械学習で非常に有名なデータセット「MNIST」を用いて、テンプレートのニューラルネットを用いて学習させるのではなく、自作のニューラルネットを用いて学習を行うためにはどのようなコードを書けばよいかをご紹介します。
Python初心者にも分かりやすいように丁寧にご紹介していきますので是非参考にしてみて下さい。

PythonでMNISTを画像分類する環境説明

まずはPythonでMNISTを画像分類指定環境についてですが、最も簡単なAnacondaでの開発を実践していきます。
Anacondaの環境構築を行うためには以下のサイトを参考にして下さい。

Anaconda のインストール - python.jp
Anaconda はデータサイエンス向けの環境を提供するプラットフォームです。科学技術計算などを中心とした、多くのモジュールやツールのコンパイル済みバイナリファイルを提供しており、簡単にPythonを利用する環境を構築できます。 Anaconda はPython

次にAnacondaで「jupyter notebook」を起動します。

すると下記のような画面になるのでこのCellにコードを記述していきます。

まずは、必要なライブラリをインストールしていきます。Cellに下記を記載して下さい。

!pip install matplotlib
!pip install keras
!pip install tensorflow

こちらはAnacondaプロンプトを用いても行うことができるのですが「jupyter notebook」で行うと、いちいちプロンプトを開かなくて良いので楽です。
これで環境は作成できたので次にニューラルネットを自身で作成する方法に進みましょう。

ニューラルネットを自身で作成する手順

まずは公式のサンプルが下記のようになっています。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, InputLayer
from keras.optimizers import RMSprop

# MNISTデータを読込む
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# MNISTデータを加工する
x_train  = x_train.reshape(60000, 784)
x_test   = x_test.reshape(10000, 784)
x_train  = x_train.astype('float32')
x_test   = x_test.astype('float32')
x_train /= 255
x_test  /= 255
y_train  = keras.utils.to_categorical(y_train, 10)
y_test   = keras.utils.to_categorical(y_test, 10)

# モデルの構築
model = Sequential()
model.add(InputLayer(input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

# 学習
epochs = 20
batch_size = 128
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

# 検証
score = model.evaluate(x_test, y_test, verbose=1)
print()
print('Test loss:', score[0])
print('Test accuracy:', score[1])

コード内でも解説しておりますが、順番に解説を行なっていきます。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, InputLayer
from keras.optimizers import RMSprop

この部分でライブラリをインポートしています。Pythonコードでは基本的にimportfromを用いてライブラリをインポートします。

# MNISTデータを読込む
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# MNISTデータを加工する
x_train  = x_train.reshape(60000, 784)
x_test   = x_test.reshape(10000, 784)
x_train  = x_train.astype('float32')
x_test   = x_test.astype('float32')
x_train /= 255
x_test  /= 255
y_train  = keras.utils.to_categorical(y_train, 10)
y_test   = keras.utils.to_categorical(y_test, 10)

この部分はKerasのMNISTデータを読み込み学習させる際に便利な変数の形に定義しています。
変数それぞれの中身を見たい場合などはprint関数で、中身を確認してみてください。
また、データに関しては学習効率を考えて正気かなども行なっているようです。

# モデルの構築
model = Sequential()
model.add(InputLayer(input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

この部分が今回の肝でモデルのニューラルネットの部分になっております。詳しくは下記でご紹介します。

# 学習
epochs = 20
batch_size = 128
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

# 検証
score = model.evaluate(x_test, y_test, verbose=1)
print()
print('Test loss:', score[0])
print('Test accuracy:', score[1])

最後にこの部分がニューラルネットに沿ってモデルを学習させ、作成できたモデルの精度を検証している部分です。
ではニューラルネットの定義に注目して見ていきましょう。

ニューラルネットの決め方

先程のコードの「モデルの構築」の箇所でニューラルネットの構造を決定付けています。ここを変更することで自作のニューラルネットを構築することができます。
Modelを定義し、そのモデルの中に層と活性化関数を順番に追加していき、ニューラルネットを構築していきます。
ニューラルネットへの入出力なども確認できるので気になればmodelの中身も見てみましょう。

では実際にサンプルとして、畳み込み層を増やしてオリジナルのニューラルネットを構築していきます。

ニューラルネットの作成方法

下記のようにコードを追加するとニューラルネットとして機能します。

もともとの学習率は下記のようになったのでそれと比較を行なってみます。

Test loss: 0.270300399379
Test accuracy: 0.9273

「モデルの構築」の部分を下記に置き換えてみましょう。

model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

こちらで学習させたモデルのほうがおそらく精度は高くなると思います。実際に学習させていきましょう。

MNIST用モデルを自作ニューラルネットで学習

学習に関しても先程のコードを流用できるので下記にて学習スタート。

# 学習
epochs = 20
batch_size = 128
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

# 検証
score = model.evaluate(x_test, y_test, verbose=1)
print()
print('Test loss:', score[0])
print('Test accuracy:', score[1])

結果は以下のようになっていました。

Test loss: 0.1900398767
Test accuracy: 0.9462

比較してみると下記のような結果になります。

モデルLossAccuracy
既存0.2700.927
自作0.1900.946

やはり、既存のものが最も良いニューラルネットの構成ということで配布されているので良い結果となりました。
以上です。いかがだったでしょうか?ニューラルネットを自作で作成する方法がわかれば幸いです。

コメント

タイトルとURLをコピーしました