初心者のための TensorFlow 2.0 入門

TensorFlow.org で表示 Google Colab で実行 GitHub でソースを表示 ノートブックをダウンロード

このガイドでは簡単な導入として、Keras を使って次のことを行います。

  1. 画像を分類するニューラルネットワークを構築する。
  2. そのニューラルネットワークをトレーニングする。
  3. 最後に、モデルの精度を評価する。
  4. モデルの精度を評価します。

このファイルは Google Colaboratory の notebook ファイルです。 Python プログラムはブラウザ上で直接実行されます。TensorFlow を学んだり使ったりするには最良の方法です。Google Colab のnotebook の実行方法は以下のとおりです。

  1. Pythonランタイムへの接続:メニューバーの右上で「接続」を選択します。
  2. ノートブックのすべてのコードを実行するには、Runtime > Run all を選択します。コードセルを 1 つずつ実行するには、セルにマウスポインタ―を合わせて Run cell アイコンを選択します。

Run cell アイコン

TensorFlow をセットアップする

まず、TensorFlow をプログラムにインポートします。

import tensorflow as tf
2024-01-11 21:58:10.256420: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
2024-01-11 21:58:10.256465: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
2024-01-11 21:58:10.258031: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered

Colab ではなく独自の開発環境で手順を実行している場合は、開発用 TensorFlow のセットアップについて、インストールガイドをご覧ください。

注意: 独自の開発環境を使用している場合は、TensorFlow 2 パッケージをインストールする際に、最新の pip にアップグレード済みであることを確認してください。詳細は、インストールガイドをご覧ください。

データセットを読み込む

MNIST データセットを読み込んで準備します。画像のピクセル値は 0~255 です。値を 255.0 で割って、0~1 の範囲に変換しましょう。また、この操作によって、サンプルデータが整数から浮動小数点にも変換されます。

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

機械学習モデルを構築する

tf.keras.Sequential モデルを構築します。

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)
])

レイヤーごとに 1 つの入力テンソルと 1 つの出力テンソルを持つ複数のレイヤーをスタックするには、Sequential が便利です。レイヤーは、既知の数学的構造を持つ関数であり、再利用することが可能で、トレーニング可能な変数を含むことができます。ほとんどの TensorFlow モデルはレイヤーで構成されています。このモデルでは、Flatten(平坦化された)Dense(密な)Dropout(ドロップアウト)レイヤーが使用されています。

各サンプルについて、モデルは "logits" または "log-odds" スコアのベクトルをクラスごとに返します。

predictions = model(x_train[:1]).numpy()
predictions
array([[-0.19097573,  0.1179699 ,  0.01194721, -0.24308777,  0.13346401,
        -0.06254788, -0.38092476, -0.45347863,  0.18980238,  0.16058141]],
      dtype=float32)

tf.nn.softmax 関数は、クラスごとにこれらのロジットを "probabilities" に変換します。

tf.nn.softmax(predictions).numpy()
array([[0.08667531, 0.11805076, 0.10617534, 0.08227415, 0.11989409,
        0.09855324, 0.07168059, 0.06666407, 0.12684262, 0.12318979]],
      dtype=float32)

注意: この tf.nn.softmax をネットワークの最後のレイヤーのアクティベーション関数として組み込むことも可能です。こうすることでモデルの出力をより直接的に解釈可能にすることもできますが、softmax 出力を使用する場合、すべてのモデルに対して正確で数値的に安定した損失計算を提供することは不可能であるため、この方法は推奨されません。

losses.SparseCategoricalCrossentropy を使用して、トレーニングの損失関数を定義します。

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

損失関数は、グラウンドトゥルース値のベクトルとロジットのベクトルを取り、サンプルごとにスカラー損失を返します。この損失は true クラスの負の対数確率と同等です。モデルが確実に正しいクラスである場合、損失はゼロとなります。

トレーニングされていないこのモデルでは、ランダムに近い確率(クラス当たり 1/10)が得られるため、最初の損失は -tf.math.log(1/10) ~= 2.3 に近くなります。

loss_fn(y_train[:1], predictions).numpy()
2.3171585

トレーニングを開始する前に、Keras Model.compile を使用してモデルの構成とコンパイルを行います。optimizer クラスを adam に、loss を前に定義した loss_fn 関数に設定し、metrics パラメータを accuracy に設定して評価するモデルの指標を指定します。

model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

モデルをトレーニングして評価する

損失を最小限に抑えられるようにモデルのパラメータを Model.fit メソッドで調整します。

model.fit(x_train, y_train, epochs=5)
Epoch 1/5
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1705010297.196743  985178 device_compiler.h:186] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.
1875/1875 [==============================] - 6s 2ms/step - loss: 0.2927 - accuracy: 0.9164
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1432 - accuracy: 0.9571
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1073 - accuracy: 0.9677
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0877 - accuracy: 0.9729
Epoch 5/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0743 - accuracy: 0.9759
<keras.src.callbacks.History at 0x7f600410cb20>

Model.evaluate メソッドは、通常検証セットまたはテストセットでモデルのパフォーマンスをチェックします。

model.evaluate(x_test,  y_test, verbose=2)
313/313 - 1s - loss: 0.0888 - accuracy: 0.9737 - 608ms/epoch - 2ms/step
[0.08883671462535858, 0.9736999869346619]

tf.nn.softmax 関数はクラスごとにこれらのロジットを "確率" に変換します。

モデルが確率を返すようにするには、トレーニング済みのモデルをラップして、それに softmax を接続することができます。

probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])
probability_model(x_test[:5])
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[2.03061767e-09, 1.07744300e-10, 5.64017277e-08, 3.28148453e-05,
        2.78262417e-12, 2.44956000e-10, 4.98860393e-15, 9.99966860e-01,
        1.12172815e-09, 1.78169259e-07],
       [1.22477006e-09, 5.47834934e-05, 9.99939680e-01, 3.26903410e-06,
        6.33484771e-16, 3.66194044e-08, 9.33827735e-08, 4.53529943e-15,
        2.15393084e-06, 2.15492051e-16],
       [2.65538809e-08, 9.99216318e-01, 4.15022587e-05, 6.47234356e-06,
        1.25060133e-05, 4.67062279e-07, 4.02851782e-07, 6.92374539e-04,
        2.98961204e-05, 5.05144548e-08],
       [9.99696970e-01, 2.38823326e-08, 1.06130661e-04, 4.18278505e-05,
        2.10477902e-09, 8.39458380e-07, 5.10459586e-06, 1.47396582e-04,
        2.53375920e-09, 1.61155492e-06],
       [7.46907176e-07, 1.10678765e-10, 2.53027878e-07, 1.17473284e-08,
        9.96823311e-01, 1.78234494e-08, 3.49888296e-06, 8.87416263e-06,
        2.66323042e-07, 3.16298148e-03]], dtype=float32)>

まとめ

おめでとうございます!事前構築済みのデータセットと Keras API を使用して、機械学習モデルをトレーニングしました。

Keras のその他の使用例については、チュートリアルをご覧ください。Keras を使ったモデルの構築に関してさらに学習するには、ガイドをお読みください。データの読み込みと準備についてさらに学習するには、画像データの読み込みまたは CSV データの読み込みに関するチュートリアルをご覧ください。