どうも、とがみんです。
以前の記事で、TensorFlowを利用して、ニューラルネットワークを構築し、手書き画像データの分類を行いました。
この記事では、機械学習をより簡単に扱うためのライブラリである、「Keras」を利用して、手書き数字画像データの分類を行うニューラルネットワークを実装していきます。
Contents
Kerasとは?
「Keras」は、TensorFlowや、他にもCNTK、Theano上で実行可能なニューラルネットワークのライブラリです。
容易に素早くプロトタイプの作成が可能であり、畳み込みニューラルネットワーク、再帰ニューラルネットワーク,
またそれら2つの組み合わせもサポートされており、簡単に実装することができます。
この「Keras」を利用して、ニューラルネットワークを構築し、手書き数字の画像データを学習させ、その分類を行っていきます。
今回実装するものの概要
今回は、以下のような単純なニューラルネットワークを「Keras」を利用し実装します。
構成は前回、TensorFlowのみを使用して作成したニューラルネットワークと同じものです。
>【TensorFlow】TensorFlowによる手書き文字を分類するニューラルネットワークの実装。
実装後、手書き数字の画像データを学習させ、その認識精度を確認していきます。
実装する前に、まず手書き数字の画像データを準備します。
手書き数字画像データの準備
手書き数字の画像データを準備します。
以下のコードを実行すると、x_train、y_train、x_test、y_testに、トレーニング用とテスト用の画像データとその画像が表す数値のラベルデータを取得することができます。
1 2 3 4 5 | import tensorflow as tf #手書き数字画像データの取得 mnist = tf.keras.datasets.mnist (x_train, y_train),(x_test, y_test) = mnist.load_data() |
それぞれのデータの形状を確認すると以下のような感じになってます。
画像データは縦×横=28ピクセル×28ピクセルで、学習用画像60000個、テスト用10000個あります。
手書き数字画像データ分類ニューラルネットワークの実装
「Kears」を用いて、ニューラルネットワークを構築し、手書き数字の画像データを学習させていきます。主に以下の3ステップあります。
- モデルの構築
- モデルのコンパイル
- モデルの学習
モデルの構築
以下のようにモデルを定義します。使いたい層を順次追加していきます。
1 2 3 4 5 6 7 8 9 10 11 | model = keras.Sequential([ #28×28の行列を784要素の1次元行列に変換。 keras.layers.Flatten(input_shape=(28, 28)), #ノード数150の中間層、活性化関数はReLU関数。Denseは全結合層(Affine)。 keras.layers.Dense(150, activation=tf.nn.relu), #ノード数10の出力層、活性化関数はSoftmax関数。Denseは全結合層(Affine)。 keras.layers.Dense(10, activation=tf.nn.softmax) ]) |
上記のコードは、
1層目(入力層):入力データの平滑化。
2層目:活性化関数にReLU関数を使用した、ノード数が150の中間層。
3層目(出力層):活性化関数にソフトマックス関数を使用した、出力ノード数が10の出力層。
となっています。
モデルのコンパイル
モデルをコンパイルします。
1 2 3 | model.compile(optimizer=tf.keras.optimizers.Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) |
optimizerには、学習のアルゴリズムを指定し、lossには損失関数を指定し、metricsには、モデルの性能を測るための関数を指定します。
>評価関数の利用方法|Keras Documentation
モデルの学習
次に、モデルの学習をさせていきます。各エポックに対して、テストデータでその認識精度も確認させます。
1 | history = model.fit(x_train/255, y_train,batch_size=100, epochs=10,validation_data=(x_test, y_test)) |
画像のピクセルデータは、0〜255なので、255で割って、0〜1の値にしています。
学習済みモデルの保存と読み込み
以下のコードで学習したモデルの保存と読み込みを行うことができます。
1 2 3 4 | #モデルの保存 model.save('model/KerasNN.hdf5') #モデルの読み込み model = tf.keras.models.load_model('model/KerasNN.hdf5') |
学習結果
学習結果についてです。
認識精度と損失関数の値の推移
認識精度と損失関数の値の推移についてです。
以下コードを実行すると、グラフが表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | plt.figure(figsize = (18,6)) plt.subplot(1, 2, 1) plt.plot(history.history['acc'],marker = "o") plt.plot(history.history['val_acc'], marker = "o") plt.title('model accuracy',fontsize=21) plt.ylabel('accuracy',fontsize=21) plt.xlabel('epoch',fontsize=21) plt.legend(['train', 'test'], loc='upper left') plt.grid(color = 'gray', alpha = 0.2) plt.subplot(1, 2, 2) plt.plot(history.history['loss'], marker = "o") plt.plot(history.history['val_loss'], marker = "o") plt.title('model loss',fontsize=21) plt.ylabel('loss',fontsize=21) plt.xlabel('epoch',fontsize=21) plt.legend(['train', 'test'], loc='upper right') plt.grid(color = 'gray', alpha = 0.2) plt.show() |
テストデータに対する認識精度は「97.81%」という結果が得られました。
間違えた数字の一覧
以下に間違えた数字の一部を載せておきます。
まとめ
ニューラルネットワーク用ライブラリ「Keras」を利用して、手書き数字の画像データを分類する、単純なニューラルネットワークを構築しました。
「Keras」を利用すれば、このようにニューラルネットワークを簡単に構築できてしまいます。
参考文献
>Get Started with TensorFlow|TensorFlow