対象読者
AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちではありませんか?
今日はそんなあなたにピッタリのタスクを紹介します。コーディング自体は数分で終わります。
また、始めたばかりで100%の理解を求める必要はありません。AIはとても深い分野なので、50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。
今日は気楽にやっていきましょう!
今日のゴール
今日のゴールは下の写真のようにMNISTデータを使って、実際に正解率を出すところまでやっていきます。
また、当ページは@Ka-k(KAI Kenzo)という方の環境構築とMNISTチュートリアルの2ページを参考に書きました。KAIさんは初心者にとても良質な教材を提供されている方です。しかし、結構前に書かれているということもあり、コードが少しだけ古くなっています。
なので、今日はこのサイトを参考にしつつも今風にアレンジしつつ誰でも実装できるように解説していきます。
p.s.赤太字は当サイトで座学として解説済み&解説予定のワードです。
今日使うコード
これが今日の全コードです。理解のために、コードと説明の順番が上下するので、もし迷ったらこちらを参考にしてください。
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import to_categorical
(X_train, y_train), (X_test, y_test) = mnist.load_data()
model = Sequential()
model.add(Dense(512, input_dim=(784)))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
X_train = X_train.reshape(60000, 784)/255
X_test = X_test.reshape(10000, 784)/255
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
hist = model.fit(X_train, y_train, batch_size=200, verbose=1,
epochs=10, validation_split=0.1) #epoch数はお好みで
score = model.evaluate(X_test, y_test, verbose=1)
print("正解率(acc):", score[1])
model.save("./ai-first.h5")
仮想環境の構築
まずは仮想環境を作っていきましょう。作れればなんでもいいので、お好みのやり方でやってください。今回、私はコマンドプロンプト(cmd)から作る方法でやっていきます。
python -m venv 仮想環境名 #仮想環境の作成
仮想環境名/Scripts/activate #仮想環境の有効化(Windows version)
source 仮想環境名/bin/activate #仮想環境の有効化(Mac/Linux version)
cd 仮想環境名/Scripts #Scriptsディレクトリまで移動
echo. > ファイル名.py #Pythonファイルを作成
code . #vsCodeを開く
pythonファイルを作成する場所はactivate.batやactivateと同じディレクトリにしましょう。
仮想環境には以下のメリットがあります。
- プロジェクトごとの環境の分離
- クリーンアップの容易化
ライブラリのインストール
では、次に必要なライブラリをインストールしていきましょう。これもcmdでやっていきます。
#ニューラルネットワークやディープラーニングモデルの構築やトレーニングに使用されるライブラリ
pip install tensorflow
#大規模なデータセットを使うときに用いるパッケージ
pip install h5py
#モデルの構築、トレーニング、評価、デプロイメントなどを簡素化するライブラリ
pip install keras
#画像やビデオのキャプチャ、変換、フィルタリング、特徴抽出、物体検出、画像の編集などに使う
pip install opencv-python
MNISTを読み込む
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
from keras.datasets import mnist
#Kerasライブラリの datasets モジュールから mnist データセットをインポートする
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#mnist
データセットから訓練用データとテスト用データを読み込む
#load_data()
メソッドは、MNISTデータセットを読み込み、訓練用の画像データとラベル、テスト用の画像データとラベルをそれぞれ返す
#訓練用の画像データは X_train
に、訓練用のラベルは y_train
に、テスト用の画像データは X_test
に、テスト用のラベルは y_test
にそれぞれ代入される
モデルの準備
空のSequentialモデルを作成して、後で層を追加してニューラルネットワークモデルを構築するための準備を整えます。
from keras.models import Sequential
model = Sequential()
from keras.models import Sequential
#Kerasライブラリの models
モジュールから Sequential
クラスをインポートしています。Sequential
クラスは、ニューラルネットワークモデルを作成するためのクラスであり、層を直線的に積み重ねて構築されるシンプルなモデルです。
model = Sequential()
#Sequential
クラスのインスタンスを作成し、model
変数に代入しています。これにより、新しいSequentialモデルが作成されます。このモデルは、層を順番に追加していくことで構築されます。
モデルの構築
3層のニューラルネットワークモデルを構築しています。入力層から隠れ層(ReLU)への接続、隠れ層から出力層(Softmax)への接続があります。
from keras.layers import Dense, Activation
model.add(Dense(512, input_dim=(784)))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("softmax"))
from keras.layers.core import Dense, Activation
#Kerasの layers
モジュールから Dense
クラスと Activation
クラスをインポートしています。Dense
クラスは全結合層(密な層)を定義するためのクラスであり、Activation
クラスは活性化関数を適用するためのクラスです。
model.add(Dense(512, input_dim=(784)))
#Dense
クラスのインスタンスを作成し、モデルに追加しています。この層は、512個のニューロン(ユニット)を持つ全結合層です。input_dim
パラメータは入力の次元を指定しており、784次元の入力を受け取ることを示しています。
model.add(Activation(“relu”))
#活性化関数としてReLU(Rectified Linear Unit)関数を適用する層をモデルに追加しています。ReLU関数は、入力が0未満の場合は0を、それ以外の場合は入力をそのまま出力する関数であり、非線形性を導入するためによく使用されます。
model.add(Dense(10))
#2つ目の全結合層を追加しています。この層は10個のニューロンを持ち、出力層として機能します。入力次元は前の層から自動的に推定されるため、input_dim
パラメータは省略されています。
model.add(Activation(“softmax”))
#出力層にSoftmax活性化関数を適用する層を追加しています。Softmax関数は、クラス分類問題で各クラスに対する確率分布を生成するために使用されます。softmax関数によって、モデルの出力が各クラスに対する確率として解釈できるようになります。
モデルをコンパイル
モデルの損失関数としてカテゴリカルクロスエントロピー、最適化アルゴリズムとしてSGD、評価指標として正解率を設定していきます。(これらの設定作業をコンパイルといいます)
model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
model.compile(loss=”categorical_crossentropy”, optimizer=”sgd”, metrics=[“accuracy”])
#model.compile
: モデルをコンパイルするメソッドです。モデルをコンパイルすることで、損失関数や最適化アルゴリズムなどの設定が確定されます。
#loss="categorical_crossentropy"
: 損失関数を設定しています。この場合、カテゴリカルクロスエントロピー(categorical crossentropy)が損失関数として指定されています。カテゴリカルクロスエントロピーは、多クラス分類問題で使用される一般的な損失関数であり、予測と真のラベルの間の差異を測定します。
#optimizer="sgd"
:最適化アルゴリズムを指定しています。この場合、確率的勾配降下法(Stochastic Gradient Descent, SGD)が最適化アルゴリズムとして指定されています。SGDは、勾配を使ってモデルのパラメータを更新し、損失関数を最小化することを目指します。
#metrics=["accuracy"]
: モデルの評価指標を指定しています。この場合、正解率(accuracy)が指定されています。精度は、モデルが正確に予測した割合を示す指標です。
MNISTの前処理
正規化
Kerasでは0.0~1.0までの、float型の配列しか扱いません。また、Dense層が入力として受け取れるのは一次元配列のみです。つまり、MNISTデータセットの画像データ(28×28)を1次元の画像データ、784次元(28×28=784)のベクトルとして表現する必要があります。また、値の範囲を0から1の間に正規化する必要もあります。
*画像データの次元数とベクトルの次元数は異なる概念です。
X_train = X_train.reshape(60000, 784)/255
X_test = X_test.reshape(10000, 784)/255
X_train = X_train.reshape(60000, 784)/255
#訓練用の画像データ X_train
を再形成しています。元の画像データは28×28ピクセルの2次元配列であり、各ピクセルが0から255の値を取ります(白が0、黒が255)。
#reshape(60000, 784)
は、画像データを60000行784列の2次元配列に変形しています。これにより、各画像が28×28=784次元のベクトルとして表現されます。
#また、/255
を使って画像のピクセル値を0から1の範囲にスケーリングしています。これは、ニューラルネットワークの入力として扱う際に、値の範囲を正規化するためです。
X_test = X_test.reshape(10000, 784)/255
#テスト用の画像データ X_test
も同様に、同じ処理を施しています。テスト用の画像データも同様に784次元のベクトルに変形され、0から1の範囲にスケーリングされます。
ラベルの修正
Kerasではラベルデータを「バイナリ型」にする必要があります。バイナリ型とはデータを0と1だけで表現することです。つまり、2進数にするということです。つまり、ラベルデータをone-hotエンコーディング形式に変換すればいいのです。
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
from tensorflow.keras.utils import to_categorical
#Kerasの utils
モジュールから np_utils
をインポートしています。np_utils
モジュールには、ニューラルネットワークの学習に使用される便利な関数やユーティリティが含まれています。
y_train = to_categorical(y_train)
#訓練用のラベルデータ y_train
をone-hotエンコーディング形式に変換しています。one-hotエンコーディングでは、各ラベルがベクトルの形式で表現され、対応するインデックスの要素が1であり、それ以外の要素が0となります。これにより、分類問題でのラベルの表現をより適切に扱うことができます。
y_test = to_categorical(y_test)
#テスト用のラベルデータ y_test
も同様に、同じ処理を施しています。すべてのラベルデータがone-hotエンコーディング形式に変換されます。
(Kerasのバージョン2.4.3以降では、keras.utils
モジュールから np_utils
モジュールが削除されました。そのため、最新のKerasバージョンでは np_utils
を使うことはできません。代わりに、ここではkeras.utils
モジュールから to_categorical
関数を使用することにしています。)
モデルの訓練
訓練が開始されると、各エポックごとに訓練データと検証データの損失と評価指標が計算され、hist
オブジェクトに保存されるようにします。
hist = model.fit(X_train, y_train, batch_size=200, verbose=1,
epochs=3, validation_split=0.1)
hist = model.fit(X_train, y_train, batch_size=200, verbose=1,
epochs=10, validation_split=0.1)
#hist = model.fit
: モデルの訓練を開始するためのメソッドです。model
は訓練するニューラルネットワークモデルを指します
#X_train, y_train
: 訓練用の入力データ X_train
とそのラベルデータ y_train
を指定しています。このデータはモデルの学習に使用されます。
#batch_size=200
: ミニバッチのサイズを指定しています。ミニバッチ学習では、全データセットを小さなバッチに分割し、各バッチごとにモデルのパラメータを更新します。batch_size
は1回のパラメータ更新に使用するデータのサンプル数を指定します。
#verbose=1
: 訓練中にログメッセージを表示するかどうかを制御します。verbose=1
の場合、進捗バーが表示されます。表示した方がカッコいいですよ。(笑)
#epochs=
3
: エポック数を指定しています。1つのエポックとは、全ての訓練データを1回学習することを指します。epochs
パラメータは、モデルが訓練データを何回反復して学習するかを指定します。
#validation_split=0.1
: 検証データの割合を指定しています。訓練データの一部を検証に使用します。この場合、訓練データの10%が検証に使用されます。訓練中にモデルの性能を監視し、過学習を防ぐために使用されます
モデルの評価
先ほど訓練したモデルをテストデータを使って評価していきます。
score = model.evaluate(X_test, y_test, verbose=1)
print("正解率(acc):", score[1])
score = model.evaluate(X_test, y_test, verbose=1)
#evaluate()
:モデルの性能を評価するためのメソッドです。evaluatte()メソッドは、指定されたデータセットでモデルを評価し、損失と評価指標(ここでは正解率)を返します。
#引数 X_test
はテストデータの入力、y_test
はテストデータの出力(正解ラベル)を表します。
#verbose=1
は評価の進捗状況を表示する設定です。
print(“正解率(acc):”, score[1])
#テストデータでの評価結果を出力しています。score[1]
は、evaluate
メソッドが返す評価指標のうち、正解率(accuracy)に対応する値を取得しています。この値は、モデルがテストデータで正確に予測できた割合を示します。
学習の実行/中断
では、実行していきましょう。実行方法は人それぞれですが、私の場合はCMDでファイル名を入力することで実行しています。
#実行
ファイル名.py
#中断する時は
CtrlキーとCキーを同時押ししましょう!
学習済みモデルの保存
訓練されたニューラルネットワークモデルを”MNIST.h5″ という名前のファイルに保存しましょう。このファイルを後で読み込むことで、モデルを再利用したり、別のプログラムで使用したりすることができます。
model.save("MNIST.h5")
model.save(“MNIST.h5”)
#model
は保存するKerasモデルを指します。
#.save()
メソッドは、指定されたファイル名でモデルを保存します。ここでは、”MNIST.h5″ という名前のファイルにモデルが保存されます。拡張子 .h5
は、HDF5形式で保存されることを示しています。
保存したモデルを使うには
from keras.models import load_model
model = load_model("MNIST.h5")
hist = model.fit(X_train, y_train, batch_size=200, verbose=1,
epochs=3, validation_split=0.1)
from keras.models import load_model
#Kerasの models
モジュールから load_model
関数をインポートしています。load_model
関数は、保存されたモデルを読み込むために使用されます。
model = load_model(“MNIST.h5”)
#load_model
関数を使って、”MNIST.h5″ というファイルからモデルを読み込んでいます。読み込まれたモデルは、model
変数に格納されます。
hist = model.fit(X_train, y_train, batch_size=200, verbose=1,
epochs=3, validation_split=0.1)
#続きから学習を再開することができます。
#先ほどのコードと同じなので細かい説明は割愛します。
まとめ
おわり。お疲れさまでした。でも、意外と想像より簡単だったんじゃないですか?
また、今は100%の理解じゃなくもいいです。こーやって今日みたいに手を動かしていくことを繰り返していけば、必ず上達します。それがAscendBeyond式です。
ということで、これからもどんどん実践を積んでいきましょう!次回は畳み込み層を追加してより、画像処理の性能を向上させていきましょう!