もくじ
まずは、コード
import datetime
import os
#keras関係のインポート
from keras import Sequential
from keras.callbacks import TensorBoard
from keras.datasets import mnist
from keras.layers import Flatten, Dense, Dropout, Activation
from keras.utils import np_utils
'''
mnistデータの準備
'''
# mnistデータのロード
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 配列のデータ型を変更
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
# 配列内の値を0~1の間に最適化
x_train /= 255
x_test /= 255
# ラベルの値をone-hotに変換
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
'''
モデル構築
'''
# 最適化関数を定義
optimizer = 'rmsprop'
# 損失関数関数を定義
loss = 'categorical_crossentropy'
# モデルを定義
model = Sequential()
# 画像を一次元配列に変換する層を定義
model.add(Flatten(input_shape=x_train.shape[1:]))
# 32次元の全結合層を定義
model.add(Dense(32))
# 16次元の全結合層を定義
model.add(Dense(16))
# ドロップアウト層を定義
model.add(Dropout(0.15))
# クラス数と同じ次元の全結合層を定義
model.add(Dense(y_train.shape[1]))
# 活性化関数として"softmax"を使用
model.add(Activation('softmax'))
# モデルを構築
model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])
'''
TensorBoardの定義
'''
# "logs"という名前のディレクトリが存在しなければ作成
if not os.path.exists('logs'):
os.mkdir('logs')
# 結果を保存するためのフォルダを日付と時間で作成
tensorboard_dir = r'./logs/{}'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
# TensorBoardを定義
tensorboard_callback = TensorBoard(log_dir=tensorboard_dir)
'''
学習
'''
# エポック数を定義
epochs = 300
# バッチ数を定義
batch_size = 128
# 学習を開始
model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), shuffle=True,
callbacks=[tensorboard_callback])
上から順番に説明していく。
mnistデータの準備
# 配列のデータ型を変更
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
・配列のデータ型を「float32」にすることで少数を格納できるようにした。
# 配列内の値を0~1の間に最適化
x_train /= 255
x_test /= 255
・配列内の値を255で割ることで値を0~1.0の間に正規化している。
- 0~1にすることで比較的少ない計算量で学習できるようにしている。
- 様々な値が混在しているものをある程度一定の値にし、学習の効率化を図っている。
# ラベルの値をone-hotに変換
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
・ラベルデータ(教師データ)をone-hotへ変換
- mnistでは画像が「0~9」まであり、それぞれラベルデータとして”0~9”の値が付けられている。
- one-hotとは、上記のラベルデータを”1”なら[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]というような形にしたもののことを言う。
モデル構築
# モデルを定義
model = Sequential()
・model=Sequential()で順伝播型のモデルであると定義。
・上記で定義されたモデルに対して「model.add()」で層を追加。
Flatten()
# 画像を一次元配列に変換する層を定義
model.add(Flatten(input_shape=x_train.shape[1:]))
- 様々な次元のものを一列の配列に変換。
Dense()
# 32次元の全結合層を定義
model.add(Dense(32))
- 全結合層の定義。
- すべての層からの出力を受け取り計算を行っている。
Dropout()
# ドロップアウト層を定義
model.add(Dropout(0.15))
- ここまで使われてきた層の中で使わない割合を定義。
- 主に過学習を防ぐために使われる。
Activation()
# 活性化関数として"softmax"を使用
model.add(Activation('softmax'))
- 活性化関数の定義。
- 今回は「SoftMax」を使うことで出力結果を割合に変更している。
model.compile()
# モデルを構築
model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])
- ここまで定義してきたモデルを構築。
- 構築する際に損失関数と最適化関数を決める。
- 今回は損失関数として「交差エントロピー関数」を最適化関数として「RMSProp」を使用した。
TensorBoardの定義
# "logs"という名前のディレクトリが存在しなければ作成
if not os.path.exists('logs'):
os.mkdir('logs')
# 結果を保存するためのフォルダを日付と時間で作成
tensorboard_dir = r'./logs/{}'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
# TensorBoardを定義
tensorboard_callback = TensorBoard(log_dir=tensorboard_dir)
・TensorBoardとは、学習の様子や結果を見るための便利なツール。
学習
epochs
# エポック数を定義
epochs = 300
- 学習の回数を定義。
- Kerasではepochs=イテレーターではないので注意。
batch_size
# バッチ数を定義
batch_size = 128
- イテレーターの数で一気に何枚の画像を使って学習するかを定義。
- Kerasでは「入力された画像の枚数/batch_size」でイテレーターの数を求めている。
model.fit()
# 学習を開始
model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), shuffle=True,
callbacks=[tensorboard_callback])
- これまで定義、構築してきたモデルデータに学習データとラベルデータを渡し学習を開始。
結果例
こんな風になれば良き。
まとめ
みんな!ニューラルネットワーク…組めたよね?
ね?
組めたよね?(゜▽゜)
記事作成:N&Y