初心者のための TensorFlow 2.0 入門

View on TensorFlow.org Run in Google Colab View source on GitHub Download notebook

この短いイントロダクションでは Keras を使って下記のことを行います。

  1. 画像を分類するニューラルネットワークを構築する
  2. このニューラルネットワークを訓練する
  3. そして最後に、モデルの正解率を評価する

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

  1. Pythonランタイムへの接続:メニューバーの右上で「接続」を選択します。
  2. ノートブックのコードセルをすべて実行:「ランタイム」メニューから「すべてのセルを実行」を選択します。

TensorFlow 2 のパッケージをダウンロードしてインストールします。プログラムに TensorFlow をインポートします。

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

層を積み重ねて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)
])

モデルはそれぞれの標本について、クラスごとに"ロジット"や"対数オッズ比"と呼ばれるスコアを算出します。

predictions = model(x_train[:1]).numpy()
predictions
array([[ 0.38498694, -0.39526224,  0.22535872, -0.15563166,  0.04310162,
        -0.3473403 , -0.28732288, -0.19363233,  0.30940607, -0.3540815 ]],
      dtype=float32)

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

tf.nn.softmax(predictions).numpy()
array([[0.15243155, 0.06985813, 0.1299419 , 0.08877429, 0.10829189,
        0.07328738, 0.07782057, 0.0854641 , 0.14133525, 0.072795  ]],
      dtype=float32)

losses.SparseCategoricalCrossentropy 損失関数は、ロジットと True の インデックスに関するベクトルを入力にとり、それぞれの標本についてクラスごとに損失のスカラーを返します。

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

この損失は、クラスが正しい確率の対数をとって符号を反転させたものです。この値はモデルがこのクラスが正しいと確信しているときに 0 になります。

この訓練されていないモデルはランダムに近い確率 (それぞれのクラスについて 1/10) を出力します、最初の損失は -tf.log(1/10) ~= 2.3 に近い値になるはずです。

loss_fn(y_train[:1], predictions).numpy()
2.6133668
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

Model.fit メソッドは損失を最小化するようにモデルのパラメータを調整します。

model.fit(x_train, y_train, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3013 - accuracy: 0.9136
Epoch 2/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.1421 - accuracy: 0.9579
Epoch 3/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.1062 - accuracy: 0.9682
Epoch 4/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.0861 - accuracy: 0.9736
Epoch 5/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.0744 - accuracy: 0.9768

<tensorflow.python.keras.callbacks.History at 0x7fe4b0965fd0>

Model.evaluate メソッドはモデルの性能を検査します。これには通常 "検証用データセット" または "テストデータセット" を用います。

model.evaluate(x_test,  y_test, verbose=2)
313/313 - 0s - loss: 0.0772 - accuracy: 0.9772

[0.07715432345867157, 0.9771999716758728]

この画像識別器はこのデータセットにおいておよそ 98% の正解率にまで訓練されました。更に学ぶためには TensorFlow tutorials を参照ください。

モデルが確率を返すようにしたい場合には、モデルをラップしてソフトマックス関数を適用してください。

probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])
probability_model(x_test[:5])
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[9.44173895e-09, 6.94358404e-10, 3.79947642e-06, 4.39701034e-05,
        1.80126985e-12, 1.67197212e-09, 2.21749859e-15, 9.99951243e-01,
        5.67929170e-08, 9.21883554e-07],
       [7.79088623e-07, 3.74176976e-04, 9.99573529e-01, 4.89070990e-05,
        1.02540784e-14, 6.65212610e-07, 3.46177728e-07, 2.32120841e-14,
        1.70997953e-06, 2.19384921e-13],
       [2.41820476e-06, 9.98024464e-01, 1.30830987e-04, 3.87457731e-05,
        1.14681439e-04, 1.48148529e-05, 1.03454922e-05, 1.57439278e-03,
        8.68293500e-05, 2.53524536e-06],
       [9.99934912e-01, 7.94180867e-12, 3.35007462e-05, 3.67401071e-07,
        9.42708525e-08, 2.27556725e-07, 1.35170385e-05, 3.18891853e-06,
        2.56671262e-09, 1.42238232e-05],
       [1.92597008e-06, 6.02066841e-10, 4.11342489e-06, 3.30409513e-08,
        9.90220666e-01, 6.79421674e-08, 3.00520554e-07, 8.96678102e-05,
        6.58433947e-08, 9.68321506e-03]], dtype=float32)>