TensorFlow(Keras)による機械学習

[2024-12-30] 古い「TensorFlowによる機械学習」をとりあえず改訂しました。TensorflowからKerasが独立したので「Kerasによる・・・」という題名のほうが適切になりました。

TensorFlow(テンサーフロー,テンソルフロー)は Google の機械学習ライブラリである。今は PyTorch のほうが流行りである。Tensorflow の一部であった Keras は独立して Keras 3 となったが、tf-keras を入れることで Keras 2 も使える。

インストールは、Apple Silicon を含め、

pip install tensorflow

でできるはずである。Keras 3 を入れるには

pip install keras

Keras 2 を入れるには

pip install tf-keras

とする。

インポートする:

import tensorflow as tf

バージョンを確認する:

tf.__version__
'2.18.0'

Keras については、Keras 2 を使うなら

import tf_keras as keras

keras.__version__
'2.18.0'

Keras 3 を使うなら

import keras

keras.__version__
'3.7.0'

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

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

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

x_train, x_test = x_train / 255.0, x_test / 255.0

ごくごく簡単なモデルを定義する:

model = keras.models.Sequential([
  keras.layers.Flatten(input_shape=(28, 28)),
  keras.layers.Dense(128, activation='relu'),
  keras.layers.Dropout(0.2),
  keras.layers.Dense(10)
])

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

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

フィット:

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

Keras 2 による経過の例(Mac mini (M1 2020)):

Epoch 1/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2911 - accuracy: 0.9150
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1432 - accuracy: 0.9571
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1079 - accuracy: 0.9678
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0869 - accuracy: 0.9736
Epoch 5/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0741 - accuracy: 0.9766

Keras 3 による経過の例(Mac mini (M1 2020)):

Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 2s 805us/step - accuracy: 0.8655 - loss: 0.4684
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 790us/step - accuracy: 0.9556 - loss: 0.1505
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 794us/step - accuracy: 0.9673 - loss: 0.1075
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 790us/step - accuracy: 0.9730 - loss: 0.0891
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 794us/step - accuracy: 0.9747 - loss: 0.0798

最後に評価:

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 = keras.models.load_model("mymodel.h5")