質問があります? TensorFlowフォーラム訪問フォーラムでコミュニティとつながる

初心者のための 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.06119704, -0.20086515,  0.00702903, -0.48996255, -0.45208266,
        -0.5741232 ,  0.9203826 , -0.15006919, -0.01316312, -0.61534005]],
      dtype=float32)

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

tf.nn.softmax(predictions).numpy()
array([[0.11075646, 0.08522301, 0.10491661, 0.06382686, 0.06629099,
        0.05867498, 0.26152223, 0.08966383, 0.10281935, 0.05630574]],
      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.835742
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 2ms/step - loss: 0.4747 - accuracy: 0.8607
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1524 - accuracy: 0.9547
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1119 - accuracy: 0.9660
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0874 - accuracy: 0.9723
Epoch 5/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0757 - accuracy: 0.9759
<tensorflow.python.keras.callbacks.History at 0x7f5e0dd032e8>

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

model.evaluate(x_test,  y_test, verbose=2)
313/313 - 0s - loss: 0.0729 - accuracy: 0.9765
[0.07291319221258163, 0.9764999747276306]

この画像識別器はこのデータセットにおいておよそ 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([[2.8762310e-07, 1.7892530e-08, 7.0764213e-07, 3.2105378e-05,
        9.0844152e-11, 4.1258826e-08, 3.4897377e-11, 9.9996567e-01,
        9.9536855e-08, 1.1019590e-06],
       [1.0783906e-08, 4.3860757e-05, 9.9995041e-01, 5.5828036e-06,
        1.5878122e-14, 8.8886246e-08, 2.4903997e-11, 7.8513137e-14,
        2.3874357e-08, 5.1570967e-14],
       [4.0354365e-07, 9.9930716e-01, 2.0885863e-04, 8.4203111e-06,
        6.9717316e-05, 9.5741398e-06, 1.4762935e-05, 2.6579836e-04,
        1.1394392e-04, 1.3589201e-06],
       [9.9855071e-01, 3.3742854e-08, 1.3609608e-03, 4.1380794e-08,
        1.7093998e-06, 1.0971253e-06, 8.2079889e-05, 2.8536322e-06,
        6.2322755e-08, 5.8391095e-07],
       [1.2951501e-06, 1.1772244e-09, 8.8265404e-07, 1.2821961e-09,
        9.9867141e-01, 3.1477089e-08, 2.1445089e-06, 1.0260712e-05,
        9.7084811e-09, 1.3141247e-03]], dtype=float32)>