2018年8月2日木曜日

ディープラーニングを体感しよう:第5章(プログラムコードを見ていこう1)



こんにちは。よっしーです。

これまでの記事:
ディープラーニングを体感しよう:第1章(まずは環境構築)
ディープラーニングを体感しよう:第2章(Python環境を構築する)
ディープラーニングを体感しよう:第3章(プログラムを動かしてみよう)

前回は、ディープラーニングについて説明しました。

今回は、実際にプログラムコードの内容について見ていきたいと思います。

以下が実行したプログラムになります。

import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.layers import Activation, Dense, Dropout
from keras.models import Sequential, load_model
from keras import optimizers
from keras.utils.np_utils import to_categorical

(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]

model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))

sgd = optimizers.SGD(lr=0.1)
model.compile(optimizer=sgd, loss="categorical_crossentropy", metrics=["accuracy"])

history = model.fit(X_train, y_train, batch_size=500, epochs=5, verbose=1, validation_data=(X_test, y_test))

plt.plot(history.history["acc"], label="acc", ls="-", marker="o")
plt.plot(history.history["val_acc"], label="val_acc", ls="-", marker="x")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()


これだけ見てもさっぱりわからないので、ちょっと解説していきたいと思います。


このプログラムでは以下3つのライブラリを使っています。

numpy : 数値計算を効率的に行うためのライブラリ。
matplotlib : 各種グラフを作成しデータの可視化が可能とするライブラリ
keras : ニュートラルネットワークを扱うためのライブラリ

これらを使うためのインポート処理が以下です。

import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.layers import Activation, Dense, Dropout
from keras.models import Sequential, load_model
from keras import optimizers
from keras.utils.np_utils import to_categorical

で、次の処理で手書き数字データセットを取得しています。

(X_train, y_train), (X_test, y_test) = mnist.load_data()

ネット上から手書き数字データセットのダウンロードを行い、X_train, y_train, X_test, y_test へ展開しています。

この1行だけ見てもまったくわからないので、どんなデータかを解説すると、

X_train:学習用の画像データ
X_test:テスト用の画像データ

画像データは、28x28 pixel の グレースケール生値です。
0 ~ 9 の手書き数字の画像となっています。

イメージしやすいように1データ抜き出してみました。

[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136 175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253 225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251  93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119  25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253 150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252 253 187   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249 253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253 253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253 250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201  78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]]

なんとなく、数字「5」の画像ということがわかりますね。

y_train:学習用の画像データに対する答え
y_test:テスト用の画像データに対する答え

画像データの対となっていて、0 ~ 9 の数値(答え)が入っています。

こちらもイメージしやすいように10件ほどデータを抜き出してみました。

[5 0 4 1 9 2 1 3 1 4]

1つめの画像の答えは「5」。2つめの画像の答えは「0」・・・
という感じのデータになります。

学習用のデータは全部で60000データの配列になっており、
テスト用のデータは全部で10000データの配列になっています。


次の処理は、データを整形しています。

X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]

reshape メソッドで28x28の2次元配列を784の1次元配列に変換し、
学習用データは先頭の6000件以降を切り捨て。
テスト用データは先頭の1000件以降を切り捨て。
という処理になっています。


次の処理も、データを整形しています。

y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]

これは、答えのデータをベクトルデータに変換しています。

イメージしやすいように例で書くと、答えのデータが「5」だった場合、
以下のようなベクトルデータに変換しています。

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]

こちらも学習用データは先頭の6000件以降を切り捨て。
テスト用データは先頭の1000件以降を切り捨て。
という処理になっています。

※データを切り捨てているのは、データ量が多すぎて時間がかかってしまうからだと思います。

ちょっと長くなってきましたので、続きは次回とします。

今日はこのあたりで。ではまた~。

0 件のコメント:

コメントを投稿