概要
これまでは文章を学習させてきました
今回は画像認識を keras を使ってやってみました
コードの解説や疑問点はコメントで記載しています
mnist + Keras のチュートリアルをやってみました
コードはリファクタしていません
環境
- macOS 14.2.1
- Python 3.11.6
- tenforflow 2.15.0
- keras 2.15.0
サンプルコード
各種何をやっているかの説明はコメントに記載しています
import numpy as np
import tensorflow as tf
mnist = tf.keras.datasets.mnist
# 60000個の学習データ
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# ピクセル情報は0-255の範囲なので255で割ることで0-1の範囲に変換する
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)), # 1つの画像データが28x28のピクセルデータ
tf.keras.layers.Dense(128, activation='relu'), # ここが128なのが不明64や256でも動作はする (ハイパーパラメータか?
tf.keras.layers.Dropout(0.2), # ここの0.2なのも不明、そもそもDropout がなくても動作する (ハイパーパラメータか?
tf.keras.layers.Dense(10) # 結果は0-9の手書きの数字のどれかなので10出力
])
# 損失関数の作成 (交差エントロピー誤差)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
# モデルコンパイル
model.compile(optimizer="adam",
loss=loss_fn,
metrics=["accuracy"])
# 学習
model.fit(x_train, y_train, epochs=5)
# 評価
model.evaluate(x_test, y_test)
# 予測と結果表示
results = model.predict(x_test[:5])
# 結果はDense(10)なので10個の配列の予測値から成り立っている
# その配列10個中で一番値の大きいインデックスが予測した手書きの数字になる
# np.argmax はそれを一発でやってくれる便利メソッド
print(np.argmax(results, axis=1)) # [7 2 1 0 4] になるはず
print(y_test[:5]) # [7 2 1 0 4] こっちは答え
学習データについて
- 60000 枚の画像のデータが入っている
- 1枚の画像情報は 28 x 28 のデータで格納されている
- それぞれの情報は0-255までのピクセル情報が格納されている
- x_train が画像のピクセルデータで y_train がピクセルデータの実際の答えの数字が格納されている一次元の配列 (当然 60000 個のデータ
学習時間
M2 mac mini の GPU ありででだいたい 5 分程度で完了します
最後に
やはりレイヤーを作る部分が職人技のような気がします
0 件のコメント:
コメントを投稿