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