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