In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

初心者のための TensorFlow 2.0 入門

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

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

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

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

TensorFlow をセットアップする

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


In [ ]:
import tensorflow as tf

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

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

データセットを読み込む

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


In [ ]:
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 モデルを構築します。


In [ ]:
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" スコアのベクトルをクラスごとに返します。


In [ ]:
predictions = model(x_train[:1]).numpy()
predictions

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


In [ ]:
tf.nn.softmax(predictions).numpy()

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

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


In [ ]:
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

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

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


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

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


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

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

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


In [ ]:
model.fit(x_train, y_train, epochs=5)

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


In [ ]:
model.evaluate(x_test,  y_test, verbose=2)

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

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


In [ ]:
probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])

In [ ]:
probability_model(x_test[:5])

まとめ

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

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