TensorFlow(Keras)による機械学習

[2025-11-18] 大昔に書いた「TensorFlowによる機械学習」の修正版です。

TensorFlow(テンサーフロー,テンソルフロー)は Google の機械学習ライブラリである。今は PyTorch のほうが流行りである。Keras はその上位のライブラリで、もともとは TensorFlow 以外にも対応していたが、Keras 2.4 からは Tensorflow の一部となった。今はまた独立して Keras 3 となり TensorFlow 以外に JAX や PyTorch もサポートするようになったが、tf-keras を入れることで Keras 2 も使える。

以下は2025年11月18日現在、Mac(Apple Silicon)で試した内容である。

pip install tensorflow

とすると tensorflow-2.20.0、keras-3.12.0 が入る。古い Keras 2 を入れるには、さらに

pip install tf-keras

とすれば tf-keras-2.20.1 が入る。

さっそく使ってみよう。

import tensorflow as tf

UserWarning: Protobuf gencode version 5.28.3 is exactly one major version older than the runtime version 6.31.1 at tensorflow/core/protobuf/debug.proto. Please update the gencode to avoid compatibility violations in the next runtime release. という警告が出たが無視する。

バージョンを確認する:

tf.__version__
'2.20.0'

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

import tf_keras as keras

keras.__version__
'2.20.1'

Keras 3 を使うなら

import keras

keras.__version__
'3.12.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 Studio 2025, Apple M4 Max):

Epoch 1/5
1875/1875 [==============================] - 1s 385us/step - loss: 0.2960 - accuracy: 0.9140
Epoch 2/5
1875/1875 [==============================] - 1s 379us/step - loss: 0.1424 - accuracy: 0.9572
Epoch 3/5
1875/1875 [==============================] - 1s 378us/step - loss: 0.1107 - accuracy: 0.9665
Epoch 4/5
1875/1875 [==============================] - 1s 376us/step - loss: 0.0889 - accuracy: 0.9732
Epoch 5/5
1875/1875 [==============================] - 1s 380us/step - loss: 0.0773 - accuracy: 0.9755

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

Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 482us/step - accuracy: 0.9125 - loss: 0.2956
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 474us/step - accuracy: 0.9567 - loss: 0.1437
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 474us/step - accuracy: 0.9680 - loss: 0.1065
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 476us/step - accuracy: 0.9732 - loss: 0.0885
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 1s 472us/step - accuracy: 0.9758 - loss: 0.0763

最後に評価:

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,    3,    2,    0,    1,    3,    1,    1,    0],
       [   0, 1114,    3,    3,    0,    0,    4,    1,   10,    0],
       [   5,    0, 1010,    2,    2,    0,    1,    6,    6,    0],
       [   1,    0,    2,  999,    0,    0,    0,    4,    3,    1],
       [   0,    0,    2,    1,  961,    0,    5,    3,    2,    8],
       [   2,    0,    0,   16,    1,  862,    4,    2,    4,    1],
       [   5,    2,    0,    1,    5,    5,  940,    0,    0,    0],
       [   1,    1,    9,    4,    0,    0,    0, 1008,    0,    5],
       [   2,    0,    4,    5,    3,    3,    3,    5,  946,    3],
       [   0,    4,    0,   16,   13,    3,    1,    9,    5,  958]],
      dtype=int32)>

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

model.save("mymodel.keras")

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

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