TensorFlowによる機械学習

TensorFlow(テンサーフロー,テンソルフロー)は Google の機械学習ライブラリである。通常は

pip install tensorflow

または

pip install tensorflow-macos

で入るはずである。Apple Silicon での別の入れ方は Getting Started with tensorflow-metal PluggableDevice 参照。

tf.keras を使う上では TensorFlow 1 系 と 2 系で見かけ上の違いはほぼない。

TensorFlow 2 で 1.x のコードを走らせるには

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

とする。

TensorFlow 1.x のコードを 2.x 用に変換するには

tf_upgrade_v2 --intree dir/ --outtree dir2/ --reportfile report.txt

と打ち込む。dir/ が元のディレクトリ,dir2/ は新しく作られるディレクトリ(あらかじめ作成しておいてはいけない)。必ずしもうまくいくとは限らない。

インポートする:

import tensorflow as tf

バージョンを確認する:

tf.__version__
'2.10.0'
tf.keras.__version__
'2.10.0'

ごくごく簡単な例として,TensorFlow のチュートリアルの最初の例をやってみる。データには有名な MNIST を使う。これは28×28ピクセルの手書き画像で,ピクセル値は0から255までの整数である。

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

初回はネットからダウンロードするが次回からは ~/.keras 以下のキャッシュ(11Mバイトくらい)を使う。ピクセルは0〜255の整数値だが,0〜1の実数に変換する:

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

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

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

フィット:

model.fit(x_train, y_train, epochs=5)

経過の例(Mac mini (M1 2020) tensorflow-metal なし):

2022-09-16 15:43:59.502013: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
Epoch 1/5
1875/1875 [==============================] - 1s 592us/step - loss: 0.2949 - accuracy: 0.9131
Epoch 2/5
1875/1875 [==============================] - 1s 576us/step - loss: 0.1432 - accuracy: 0.9578
Epoch 3/5
1875/1875 [==============================] - 1s 589us/step - loss: 0.1087 - accuracy: 0.9680
Epoch 4/5
1875/1875 [==============================] - 1s 594us/step - loss: 0.0877 - accuracy: 0.9726
Epoch 5/5
1875/1875 [==============================] - 1s 571us/step - loss: 0.0759 - accuracy: 0.9766

pip install tensorflow-metal すると GPU が使えるはずだが、かえって遅くなってしまったので、pip uninstall tensorflow-metal した。)

最後に評価:

model.evaluate(x_test, y_test)

正解率 0.977 程度である。

予測は次のようにして求められる:

y_pred = tf.argmax(model.predict(x_test), axis=-1).numpy()

混同行列を求める:

tf.math.confusion_matrix(y_test, y_pred)

結果の例:

<tf.Tensor: shape=(10, 10), dtype=int32, numpy=
array([[ 969,    0,    1,    2,    2,    2,    2,    1,    1,    0],
       [   0, 1118,    3,    1,    0,    1,    4,    1,    7,    0],
       [   3,    2, 1011,    3,    1,    0,    2,    5,    5,    0],
       [   0,    0,    5,  992,    0,    4,    0,    3,    4,    2],
       [   2,    0,    5,    0,  954,    1,    4,    2,    2,   12],
       [   3,    0,    0,   11,    2,  863,    5,    1,    6,    1],
       [   5,    3,    1,    0,    1,    3,  944,    0,    1,    0],
       [   1,    5,   11,    4,    0,    0,    0,  995,    2,   10],
       [   2,    0,    3,    6,    5,    3,    2,    3,  948,    2],
       [   2,    6,    0,    7,    9,    2,    1,    3,    4,  975]],
      dtype=int32)>

学習済みのモデルをHDF5形式で保存する:

model.save("mymodel.h5")

保存したモデルは次のようにして読み出す:

model = tf.keras.models.load_model("mymodel.h5")