🦣

TensorflowとKerasで体験するディープラーニング チュートリアル

2023/08/22に公開

はじめに

本記事では、Tensorflowが提供しているディープラーニングのチュートリアルを通して、ディープラーニングがどのように動作するのか、その仕組みについて解説していきます。

https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ja


チュートリアルでは、ディープラーニングの処理に必要なモデルの構築、ニューラルネットワークの構築、活性化関数、過学習、最適化、損失関数といった、難しい内容を手軽に試すことができます。

最終的にPythonのコードを実行して、ディープラーニングを行いテストデータに対するモデルの損失(loss)と精度(accuracy)が出力して「正解率〇〇%」でしたという結果が出るところまで実装したいと思います。

Test loss: 0.07632743567228317
Test accuracy: 0.9761000275611877



ディープラーニングとは

ディープラーニング(深層学習)とは、より人間の脳に近い方法でコンピューターに学習させる方法のことを指します。コンピューターが様々な物事を理解するために、情報を与えて学習させることで、人間が学習するのと同じようにコンピューターでも学習させることができます。

ディープラーニングでは、脳の神経細胞の仕組み(ニューロン)を人工的に模倣して、ニューロンから信号を入力し、「活性化関数」を適応することで、ニューロンを発火させるか判断します。発火現象はニューロンへの入力信号を受け入れるか拒否するかを決定します。ディープラーニングの場合、データを入力して活性化関数に通して、条件にマッチして閾値を越えれば発火するという仕組みになります。
発火するかどうかは、活性化関数の入力値によって決定され、「重み」や「バイアス」を利用して、開発者が値を調整して発火するかどうかを決定します。



活性化関数

活性化関数とは受け取った情報が有益(出力値の強い値)か、否か、ふるいにかける機能を持っていて、非線形性を導入する役割を果たしています。活性化関数がなければ、ただの線形変換(行列の乗算とベクトルの加算)の集まりとなり、線形問題しか解くことができなくなります。しかし、活性化関数が存在することにより、ニューラルネットワークは非線形問題も解くことが可能となります。



ニューラルネットワークについて

ニューラルネットワークとは、人間の脳の神経回路の構造を数学的に表現する手法のことを指します。複数の脳の神経細胞を模して作られた人工ニューロンによって構成されており、樹状突起で信号を受け取った後、次へ情報を伝えるためにシナプス(神経情報を出力する側と入力される側の間に、情報伝達するための接触構造のこと)を作成します。伝達された情報は、入力層、中間層、出力層の順に処理されていきます。


出典:Wikipedia



Tensorflowとkerasとは何か?

TensorflowはGoogleが開発した機械学習用のライブラリで、パターン認識やデータの分類を行うことができます。

import tensorflow as tf


Kerasは、Pythonのディープラーニング(深層学習)のライブラリです。tensorflowからKerasにアクセスすることができます。

tf.keras



MNISTについて

MNISTとは、28ピクセル×28ピクセルのグレースケール(白黒)画像で構成された、60,000枚の訓練画像と10,000枚のテスト画像のデータセットのことです。「機械学習の "Hello, World!"」と呼ばれており、初学者が最初に試すデータセットとしてよく利用されています。

出典:Wikipedia

以下のコードを実行することでkerasからMNISTを読み込むことができます。

mnist = tf.keras.datasets.mnist



ディープラーニングの実装

それではチュートリアルに記載されている内容を通して、Pythonで実装してみたのでそれぞれ解説していきたいと思います。

import tensorflow as tf

# mnistの読み込み
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
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)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10)
])

predictions = model(x_train[:1]).numpy()
tf.nn.softmax(predictions).numpy()

# 損失関数の定義
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[:1], predictions).numpy()

# 訓練プロセスの定義
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])


model.fit(x_train, y_train, epochs=5)  # 学習
test_loss, test_acc = model.evaluate(x_test, y_test)  # テスト

print(f'Test loss: {test_loss}')
print(f'Test accuracy: {test_acc}')




MNISTの読み込み

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0  # 画像データの正規化

x_train, y_train及びx_test, y_testで機械に訓練させる用のデータとテスト用のデータに分割します。

/ 255.0による操作は、画像データの正規化(Normalization)処理を行っています。各ピクセルの値が0から255(赤(Red)、緑(Green)、青(Blue)の色の強度をそれぞれ0から255の値で表現)の整数で表現されている画像データを、0から1の範囲の浮動小数点数に変換しています。この処理を行うことで、ューラルネットワークは小さな数値(特に0近辺)を入力として受け取った方が、浮動小数点数の誤差を防ぐことができ、学習の安定性をもたらします。



モデルの定義

# モデルの定義
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10)
])

次にモデルの構築を行います。tf.keras.layers.Dense(128, activation='relu')で先ほど述べた活性化関数の定義を行っています。活性化関数を使用することで有益な情報だけを伝えることができ、有益でない弱い入力値は0や-1に近い値に抑制して出力し,次の層で無視するような出力を行うことができます。

活性化関数には、様々な種類がありますが、その中でもよく使用されているのがランプ関数です。


出典:Wikipedia

ランプ関数においては、xが正の場合はy=xを、xが負の場合は0を示しています。

tf.keras.layers.Dropout(0.2)では、過学習を防ぐためのドロップアウト率を指定しています。
過学習とは、機械学習モデルが事前に用意した訓練データに対して過度に適応し、新しい未見のデータ(テストデータや実際の運用時のデータ)に対する性能が低下する現象のことを指します。ドロップアウトを適用することで訓練時に、一部のニューロンの出力をランダムにゼロに設定して過学習を起きにくくすることができます。訓練できるデータを増やすことも過学習対策として有効です。

tf.keras.layers.Dense(10)では、10個のノードを持つ全結合層をモデルに追加しています。全結合層において、その層のすべての入力がすべての出力に結合することになります。



損失関数の定義

# 損失関数の定義
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[:1], predictions).numpy()

損失関数とはモデルが算出した予測値と、実際の正解値のズレを計算するための関数であり、上記コードでは、SparseCategoricalCrossentropyを使用して、損失関数を定義しています。実際の正解値のズレが小さいほど、モデルの予想が正解に近いことになります。



訓練プロセスの定義

# 訓練プロセスの定義
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

model.compile関数を通して、訓練するプロセスを定義しています。Sequentialで学習する順番を設定して、実際の学習の方法をここで定義します。
Optimizerはどのようにして学習を最適化するかを設定することができ、kerasが事前に用意してくれているoptimizer='adam'を定義します。

lossはその名の通り、損失関数を決定していて、先ほど定義したloss_fnを指定します。metrics=['accuracy']において、訓練とテストの間にモデルの正解率を計算・表示することを指定しています。



訓練・テストの実行

model.fit(x_train, y_train, epochs=5)  # 学習
test_loss, test_acc = model.evaluate(x_test, y_test)  # テスト

model.fitmodel.evaluateで訓練の実行、テストを行います。
epochsで学習する回数を設定することができます。



最終的に、pythonコード実行した結果は以下の通りとなります。

Epoch 1/5
1875/1875 [==============================] - 2s 927us/step - loss: 0.2966 - accuracy: 0.9143
Epoch 2/5
1875/1875 [==============================] - 2s 950us/step - loss: 0.1445 - accuracy: 0.9577
Epoch 3/5
1875/1875 [==============================] - 2s 930us/step - loss: 0.1096 - accuracy: 0.9676
Epoch 4/5
1875/1875 [==============================] - 2s 938us/step - loss: 0.0898 - accuracy: 0.9719
Epoch 5/5
1875/1875 [==============================] - 2s 943us/step - loss: 0.0730 - accuracy: 0.9776
313/313 [==============================] - 0s 359us/step - loss: 0.0763 - accuracy: 0.9761
Test loss: 0.07632743567228317
Test accuracy: 0.9761000275611877

テストデータに対する精度(accuracy)が約97.61%となっていて、高いパフォーマンスを発揮していることが理解できます。



さいごに

今回は、Tensorflowのチュートリアルを通してディープラーニングの仕組みについて確認していきました。活性化関数や過学習など聞き慣れない単語が多く出てきましたが、チュートリアルで手軽に試せることが出来ました。



参考文献

https://qiita.com/Kuma_T/items/4449f008cad18fbb7f1a

https://note.nkmk.me/python-tensorflow-keras-basics/

https://www.amazon.co.jp/gp/product/B0921KR12Z/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1

Arsaga Developers Blog

Discussion