In [0]:
# 京都大学がんプロセミナー(2019/2/17)
# 「Deep learningによる医用画像解析の深化と進化」
# オンライン演習用資料
#  - Google Colaboratoryを利用したMNIST手書き数字データセットの自動認識演習 -
#
# Copyright @2019 e-Growth Co., Ltd.
# http://www.egrowth.co.jp/
# 
In [0]:
# この資料では初心者向けに、MNISTデータを利用した簡単な文字認識モデルの学習を行います
In [0]:
# データロード
# kerasという深層学習ライブラリーではMNISTデータをダウンロードする機能が予め実装されている

import keras
from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
In [0]:
# 配列確認
# 学習に6万データ、検証用に1万データが読み込まれていることが確認できる
print("x_train:",x_train.shape)
print("y_train:",y_train.shape)
print("x_test:",x_test.shape)
print("y_test:",y_test.shape)
In [0]:
# 画像の表示確認
# MNISTの手書き文字画像(28x28ピクセル)とはどのようなデータかについて
# 最初の10文字だけ表示確認してみる
import matplotlib.pyplot as plt

plt.imshow(x_train[:10].reshape((280,28)))
plt.gray()
In [0]:
# 学習用に整形(入力部)
# 今回は画像を2次元ではなく、28x28ピクセルを784x1の1次元配列として入力してみる
x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784)     

# 学習用に正規化(入力部)
x_train = x_train.astype('float32') / 255     
x_test = x_test.astype('float32') / 255

print("x_train:",x_train.shape)
print("x_test:",x_test.shape)
In [0]:
#学習用に整形(出力部)
print("y_train:",y_train.shape)
print("y_test:",y_test.shape)

# クラス分類モデルの場合、出力(教師ラベル)をOne-Hot表現に変換
num_classes=10  #0-9までの数値の認識だから10クラス
y_train_one_hot = keras.utils.to_categorical(y_train, num_classes)
y_test_one_hot = keras.utils.to_categorical(y_test, num_classes)
print("y_train_one_hot:",y_train_one_hot.shape)
print("y_test_one_hot:",y_test_one_hot.shape)
In [0]:
# モデル生成
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Adam

# 784x1の入力、10次元の出力を持つ3層程度のモデルを作成
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.5))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))

# 出力層。排他クラス分類モデルのため、出力層の活性化関数はsoftmaxを採用する
# softmax関数は各出力の和が1.0になるので、出力を確率と見なせる
model.add(Dense(10, activation='softmax'))   

model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
model.summary()
In [0]:
#学習実行
batch_size = 128  # バッチサイズ(学習実施のたびに6万データからランダムに128個のデータをサンプリングするよう指定)
epochs = 10       # エポック(学習サイクル数。サイクルごとに検証データを利用した精度評価が行える)

history = model.fit(x_train, y_train_one_hot,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test_one_hot))
In [0]:
# モデル評価(検証データを利用してモデルの精度を確認する) 
score = model.evaluate(x_test, y_test_one_hot, batch_size=batch_size, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
In [0]:
# モデル保存
# ただし、下記のパスしていではGoogleコラボのストレージにモデルが保存されるので、セッションが切れるとデータが消失する
# Googleドライブ側へ保存するやり方については次の資料の「おまけ」部分で説明する
model.save("mnist.hdf5")
In [0]:
# ちゃんと保存されているかを確認
!ls