🏹

TensorFlow の概念と python 実装例

2025/01/07に公開

TensorFlowとは

概念

TensorFlow は Google が開発したオープンソースの機械学習フレームワークであり,深層学習を中心に,大規模な数値計算や機械学習モデルの構築・学習・推論に用いられています.本記事では Python による実装例を示しますが,C++, JavaScript (TensorFlow.js)などからも利用できます.

特徴

  • 自動微分:機械学習の上で必要な勾配を自動的に計算できます
  • GPU や TPU を活用した高速化:大規模な行列演算を効率よく実行できます
  • Keras を用いた高レベル API:直感的にニューラルネットワークを構築できる Keras API が公式に同梱されているため,短いコードでモデルを定義しやすいです.

Python で TensorFlow を使う例

まず,非常にシンプルな例として「入力値 x から出力値 y を予測する線形回帰」のモデルを作ります.

環境準備

Google Colab を利用する場合は必要ありませんが,下記のコマンドでインストールできます.

pip install tensorflow

数値予測サンプルコード

import tensorflow as tf
import numpy as np

# 1) 線形回帰モデルを定義
#   全結合(Dense)の一層だけを持つ単純なモデルです
#   shape=(1,) は入力が 1 次元であることを意味します
#   units=1 は出力ニューロン数が 1 つであることを意味します。
model = tf.keras.Sequential([
    tf.keras.Input(shape=(1,)),
    tf.keras.layers.Dense(units=1)
])

# 2) モデルのコンパイル
#   - 損失関数: mean_squared_error (平均二乗誤差)
#   - 最適化手法: SGD (確率的勾配降下法)
model.compile(optimizer='sgd', loss='mean_squared_error')

# 3) 学習データ作成
#   ここでは例として、 y = 2x - 1 を満たすデータを用意します
#   xs: 入力 (x)、ys: 出力 (y)
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0], dtype=float)

# 4) モデルの学習 (フィッティング)
#   epochsは学習を何回繰り返すか(反復回数)を指定します
#   verbose=0 にすると学習のログ出力を抑制します
model.fit(xs, ys, epochs=500, verbose=0)

# 5) 推論 (予測) 
#   学習したモデルに、新しい入力値を与えたときの出力を確認します
test_value = np.array([[10.0]])
prediction = model.predict([test_value])
print(f"x={test_value} のときの予測値は {prediction[0][0]} です")

これを実行すると以下の結果が出力されます.

x=[[10.]] のときの予測値は 18.990312576293945 です

このコードでは学習データから y=2x-1 の式が導かれ,推論では x=10 が代入されるため,19 が正解となりますが,ほぼ正確な値が出力されました.ここでのポイントは,人間側が y=2x-1 の式を直接入力してはいないですが,y=2x-1 の式を満たす xy のデータセットから答えが導かれている点です.

ここでの tensorflow の役割は model の定義とモデルの学習になります.tf を用いて定義された変数 model は model.fit(条件) にて学習することができます.

手書き数字の画像分類サンプルコード

AI の性能を測るとき,手書き文字のデータセット「MNIST」を用いた分類問題がよく用いられます.TensorFlow では mnist データセットが既にあるので,それを load_data() で読み取り,学習に用います.最終的にはテストデータの分類問題の正解率で評価します.

import tensorflow as tf
from tensorflow import keras

# MNIST データの読み込み (28x28ピクセルの手書き数字画像)
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 画素値を 0~1 の範囲に正規化
x_train = x_train / 255.0
x_test  = x_test  / 255.0

# モデルを定義 (全結合ネットワーク)
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),     # 28x28 の画像を 784 次元ベクトルに変換
    keras.layers.Dense(128, activation='relu'),     # 隠れ層
    keras.layers.Dense(10, activation='softmax')    # 出力層 (0~9 の10クラス分類)
])

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

# 学習
model.fit(x_train, y_train, epochs=5)

# テストデータで評価
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f"テストデータに対する正解率: {test_acc:.3f}")

出力結果

テストデータに対する正解率: 0.972

Life is like a boat

Discussion