Techvenience

Technology × Convenience - Vue / React / Next / Nuxt / ChatGPTなどのIT技術がもたらす便利さをお伝えします。最近はChatGPTなどのAI技術を使ってブログを書いています。

【機械学習】TensorFlowの基本分類チュートリアル「Fashion MNIST」を実行しながら解説 - Part2 -【TensorFlow】

【機械学習】TensorFlowの基本分類チュートリアル「Fashion MNIST」を実行しながら解説 - Part2 -【TensorFlow】

正規化

前回の続きで、実装の説明に入ります。
機械学習では入力データになんらかの変換をかけることを「前処理」と言いますが、正規化は前処理の一つです。
正規化の手法は複数ありますが、ここではそれらの詳細には触れません。

過学習を防ぐ

正規化を行う理由にはいくつかありますが、その一つには過学習を防ぐことがあります。
過学習とは訓練データにだけ適応し、未知のデータに対応できない状態のことです。
機械学習などの最終的な目的は、汎用性にあるので未知のデータに対応できないというのは大きな問題です。

min-max normalization

チュートリアルでは正規化の手法の一つである、min-max normalizationを使っています。
min-max normalizationは最大値と最小値の範囲が決まっているときなどに使います。
このチュートリアルが持つデータは0〜255ピクセルという、最小値(0)と最大値(255)が決まっているので、min-max normalizationを使うのが最適です。

min-max normalizationの式は以下のようになります。

処理後の値 = (処理前の値 - 最小値)/(最大値 - 最小値)

今回の例に当てはめると、

処理後の値 = 処理前の値/255

となります。処理前の値を最大値の255で割っています。
それが以下のコードになります。

# normalization
train_images = train_images / 255.0
test_images = test_images / 255.0

これで正規化も完了です。

分類クラス

次に、分類されるクラスのラベルを用意します。
これは単に、訓練ラベルなどが何を表すかを決めることなのであまり説明はいらないと思います。

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

前回の記事でも書きましたが、このチュートリアルでは以下のようなクラス分けがされています。

0 => Tシャツ/トップ
1 => ズボン
2 => セーター
3 => ドレス
4 => コート
5 => サンダル
6 => シャツ
7 => スニーカー
8 => バッグ
9 => アンクルブーツ

モデルの作成とコンパイル

続いてモデルの作成を行いましょう。
モデルの作成は、ニューラルネットワークの構築に必要です。

# create model
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

細かく実装を見ていきます。

モデルの作成

最初に、モデルを作成する際に使用する「SequentialモデルAPI」です。
Sequentialモデルは層を積み重ねたものです。
詳細は公式ドキュメントをご覧ください。

Sequentialモデルのガイド - Keras Documentation

model = keras.Sequential([
	# layers
])

コンストラクタにレイヤーのインスタンスを与えることでSequentialモデルを作ります。

データを再フォーマット

今回の一番最初のレイヤーはフォーマットするためだけにあります。
tf.keras.layers.Flattenによって、画像のフォーマットである2次元配列(28×28ピクセル)を (28×28=)784ピクセルの1次元配列に変換します。

model = keras.Sequential([
	keras.layers.Flatten(input_shape=(28, 28)),
	# other layers
])
第1のDense層

tf.keras.layers.Denseを使って層を定義します。
第1のDense層では128個のノードを持つ、ReLUレイヤーです。

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    # ....
])

活性化関数としてReLUを使っています。
ReLUは入力が0以下の場合は0を返し、入力が0より大きい場合は入力値を返す関数です。

活性化関数 - Wikipedia

第2のDense層

今回のモデルでは最後のレイヤーになります。
第2のDense層は10ノードを持つsoftmaxレイヤーです。

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

活性化関数としてsoftmax関数を使っています。
softmax関数の特徴として、返却される値は0〜1の数値であり、出力される値の合計は必ず1になります。
今回の例で言えば、以下の分類クラスのどれに当てはまるかを表す確率を配列で返却します。

0 => Tシャツ/トップ
1 => ズボン
2 => セーター
3 => ドレス
4 => コート
5 => サンダル
6 => シャツ
7 => スニーカー
8 => バッグ
9 => アンクルブーツ

例えば、ある画像を入力値として与えた場合には以下のような結果が返ってきたとします。

[0.01, 0.01, 0.03, 0.95, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00]

これが表すのは、

Tシャツ/トップ、ズボンである確率が1%
セーターである確率が3%
ドレスである確率が95%
それ以外である確率は0%

ということです。

モデルのコンパイル

続いて、モデルのコンパイルを行います。
モデルのコンパイルとは、モデルの学習を始める前にどのような学習をするかを設定する作業になります。
具体的には、「損失関数」と「最適化アルゴリズム」と「評価関数のリスト」を引数として設定します。

Sequentialモデルのガイド - Keras Documentation

# compile model
model.compile(optimizer=tf.train.AdamOptimizer(), 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

それぞれについては公式ドキュメントにも記載がありますが、ここでも軽く触れておきます。

損失関数

この損失関数を最小化するようにすることを目的とします。
この損失関数の値がモデルの性能を表しており、損失関数が小さくなれば性能の高いモデルと言えます。
様々な損失関数がありますが、ここでは分類問題でよく使われる「sparse_categorical_crossentropy」を使っています。

損失関数 - Keras Documentation

最適化アルゴリズム

オプティマイザと呼ばれる、最適化アルゴリズムを設定します。
オプティマイザとは損失関数の値を最小化するために、パラメータを更新するための機能になります。
このチュートリアルではAdamオプティマイザを使用します。
Adamオプティマイザの詳細な説明はここでは省きます。

最適化 - Keras Documentation

評価関数のリスト

モデルの性能を測るために使われます。
評価関数には、既存の評価関数以外にも自分で作った評価関数を使うことも可能です。
ここでは「accuracy」を指定しています。

評価関数 - Keras Documentation


長くなったので、訓練フェーズは次回にします。