はじめに
前回まででmodelとそのmodelを計算させるためのcoplileの設定を行いました。今回はいよいろ計算についてです。
fitについて
ChatGPTからコードの全体像です。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# MNISTデータセットの読み込み
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# データの前処理
X_train = X_train.reshape((X_train.shape[0], -1)).astype('float32') / 255
X_test = X_test.reshape((X_test.shape[0], -1)).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# モデルの構築
model = Sequential([
Dense(128, activation='relu', input_shape=(784,)),
Dense(64, activation='relu'),
Dense(10, activation='softmax')
])
# モデルのコンパイル
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# モデルのトレーニング
model.fit(X_train, y_train, epochs=10, batch_size=32)
# テストデータでモデルを評価
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Loss: {loss}, Accuracy: {accuracy}")
今回はこの中でも特に
# モデルのトレーニング
model.fit(X_train, y_train, epochs=10, batch_size=32)
に着目して調査していきます。
fitについて調査してみた
modelは前々回調査しました。
modelのメソッドとしてfitがあり、fitの中身は学習させるための学習データと教師データがあり、epochとbatch_sizeがあります。学習データと教師データはデータの前処理で説明しています。今回はepochとbatch_sizeについて調べていきます。
学習方法について
まず、学習には大きく分けて
・バッチ学習 : すべてのデータを使って学習
・ミニバッチ学習 : すべてのデータのうちグループを作って学習し、すべてのデータが網羅されるようにグループ分学習
・オンライン学習 : ランダムに1つずつ追加しながら学習
があるようで、私の説明では分かりづらいと思うので、
学習の種類についてはこちら
がすごく分かりやすい説明です。
今回はこの中でもミニバッチ学習という手法がとられているみたいです。
ミニバッチ学習について
ミニバッチ学習についてさらに詳しく調査します。
ミニバッチ学習はバッチ学習とオンライン学習のいいとこどりなようです。
では、ミニバッチ学習の原理を調査します。
バッチサイズやエポックというキーワードが重要なようなので、調べます。
バッチサイズや計算回数についてはこちら
色々調べましたが、これが一番分かりやすかったと思います。実際のデータと関連させようとすると下図のようなイメージが理解しやすいかと思いました。
左の黒枠で囲ったものがExcelや前回までの2次元配列のようなデータで上から1行に1データずつ並んでいると思ってください。
ミニバッチ学習では上からバッチサイズ分(32データ(32行))取り出し、学習。次のバッチサイズ分取り出し、学習。を繰り返し行っているようです。この繰り返しの回数がバッチ数やイテレーションと呼ばれているようです。データ全体の学習が終わったら1エポックとなるようです。
1エポック終わったら、データをシャッフルして、また、上からバッチサイズ分取り出し、学習を繰り返していくようです。
これが私がミニバッチ学習の理解の仕方です。
実行して確認してみた
さて、本題に戻りまして、
# モデルのトレーニング
model.fit(X_train, y_train, epochs=10, batch_size=32)
全体を学習させる回数(エポック数)は10回で、全体のデータのうちどのくらいのデータ数(バッチサイズ)で学習させるかは32で行っているようです。
これを実行すると以下のようになりました。
Epoch 1/10
1875/1875 [==============================] - 5s 2ms/step - loss: 0.2326 - accuracy: 0.9312
Epoch 2/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1021 - accuracy: 0.9689
Epoch 3/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0706 - accuracy: 0.9778
Epoch 4/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0530 - accuracy: 0.9829
Epoch 5/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0403 - accuracy: 0.9866
Epoch 6/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0353 - accuracy: 0.9883
Epoch 7/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0273 - accuracy: 0.9906
Epoch 8/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0232 - accuracy: 0.9926
Epoch 9/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0222 - accuracy: 0.9923
Epoch 10/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0194 - accuracy: 0.9935
エポック数は10となっていますね!そして、32(バッチサイズ)×1875(バッチ数)=60000(全体のデータ数)になってます!理屈と実行結果が一致しました!
しかも1エポックあたり4秒で終わってますね…。速いですね。
さらに、loss(誤差関数)が小さくなり、accuracy(評価関数)が高くなってますね。
なんか感動です(笑)。
コメント