るぴブロ

備忘録とかです(*'ω'*)

Hello World of Machine Learning!!

こんばんは。
会社から帰って家の事して色々してるといつもこの時間になってしまいますね。

福岡県ではコロナウイルスの感染者が 12 人に増えてしまいました💦
しっかり食べて、しっかり寝て、適度に運動して、うがい手洗いもして、出来るだけ人が集まるところは避けながらコロナに負けない生活習慣を心掛けたいです。

さて、先日までに Windows マシンの機械学習環境の構築をやっていきましたが、どうしてもやらないといけない事があって(ジャンプを読みたくて)動作確認をしてませんでしたので動作確認をしていきたいと思います。

rupic.hatenablog.com

機械学習Hello World → MNIST の画像分類

機械学習はじめまして!な方用として良く使われる MNIST 。
様々な Hello World の中でもトップクラスの感動を得られますw
※個人的に一番感動したのは Lチカでした

MNIST

Mixed National Institute of Standards and Technology database
28x28 ピクセルの手書き数字画像のデータセットで 6,0000 個のトレーニングデータと 1,0000 個のテストデータが収容されています。

詳しく知りたい方は以下の記事で確認してみてください。

udemy.benesse.co.jp

なにするの?

Tensorflow のチュートリアルにある、 MNIST の6,0000 個のトレーニングデータを学習して機械学習モデルを作成し、テストデータを用いてモデル精度を確認します。 www.tensorflow.org

学習モデルを作成する

Anaconda Prompt 等で Tensorflow-gpu 2.1.0 をインストールします。

pip install tensorflow-gpu==2.1.0

f:id:rupic:20200327004400p:plain

main.py

# 必要なライブラリをインポートする
import tensorflow as tf
from tensorflow.keras import datasets, layers, models

# MNIST データセットをダウンロード
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# データ数、縦px、横px、チャンネル(グレースケール:1、カラー:3)
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))

# ピクセルの値を 0~1 の間に正規化
train_images = train_images / 255.0
test_images = test_images / 255.0

# モデルを作成
model = models.Sequential()
# 畳み込み:活性化関数 relu → 入力 x が x<=0 であれば 0 を、x>0 であれば x を返す
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
# 出力をダウンスケール
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# 3x3x64 次元のテンソル → 576個の要素を持つ1次元のベクトルに変換
model.add(layers.Flatten())
# 全結合層 
model.add(layers.Dense(64, activation='relu'))
# softmax関数 → 0~1 の範囲で値を算出
model.add(layers.Dense(10, activation='softmax'))

# モデルの概要を出力
model.summary() 

# モデルをコンパイル
# optimizer:最適化アルゴリズム
# loss:損失関数 (スパースなマルチクラス分類交差エントロピー関数)
# metrics:評価関数
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 学習開始 epoc は学習回数
model.fit(train_images, train_labels, epochs=5)

#モデルを保存
model.save('./model')

# テストデータを用いて精度の確認
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print(test_acc)

f:id:rupic:20200327014028p:plain
model.summary() の表示内容
f:id:rupic:20200327005802p:plain
実行するとすごい勢いで文字が流れていきます

f:id:rupic:20200327013647p:plain
指定 学習回数(5 epoch) が終了すると、テストデータを用いて精度を確認

最後に

言語系の Hello World と違ってデータセットを準備したり、少し長めのコードを書く必要がありますが、実際に動かした時の感動は中々なものですね。
もっと精度を上げるには学習の回数を変えてみたり、レイヤーを変えてみたり、最適化アルゴリズムを変えてみたり、学習レートを調整してみたり、データを可視化してみるのもいいですね…。調整出来る箇所が多いですが、色々と試してみてどんな変化があるか見てみるといいかもしれません😊