TensorFlowを用いて、シンプルな単層パーセプトロンから隠れ層を持つ多層ネットワークまでを段階的に構築し、分類タスクを解く実践的手法を紹介します。
単層モデルの構築と可視化
最も基本的なニューラルネットワークである単層パーセプトロンは、入力と出力の直結構造を持ちます。まず、2次元平面上に配置された11個のデータ点を2クラスに分類するタスクを設定します。各点の座標とラベルをNumPy配列で定義し、Matplotlibで可視化します。
import numpy as np
import matplotlib.pyplot as plt
# 学習用データの準備
points = np.array([
[1.0, 3.0], [1.0, 2.0], [1.5, 2.0],
[2.0, 3.0], [2.5, 1.5], [2.0, 1.0],
[3.0, 1.0], [3.0, 2.0], [3.5, 1.0],
[1.0, 1.5], [3.5, 3.0]
])
labels = np.array([[1,0]]*6 + [[0,1]]*5)
# データ分布の可視化
colors = ['red' if lbl[0] == 1 else 'blue' for lbl in labels]
plt.scatter(points[:,0], points[:,1], c=colors, s=60, edgecolors='k')
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()
中間層を加えた多層モデルの設計
単層では表現しきれない非線形パターンに対応するため、ReLU活性化関数を持つ隠れ層を追加します。これにより、モデルはより複雑な決定境界を学習できるようになります。
from tensorflow import keras
# 多層モデルの定義
network = keras.Sequential([
keras.layers.Dense(8, activation='relu', input_shape=(2,)),
keras.layers.Dense(2)
])
# 学習設定
network.compile(
optimizer='adam',
loss=keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy']
)
# 学習実行(2000エポック)
history = network.fit(points, labels, epochs=2000, verbose=0)
予測結果の確率マップ表示
学習済みモデルにSoftmaxレイヤーを追加して確率出力を得ます。グリッド状のテスト点に対して予測を行い、カラーマップでクラス確率を可視化することで、モデルの判断境界と不確実領域を把握できます。
# 確率予測用モデル
prob_model = keras.Sequential([network, keras.layers.Softmax()])
# グリッドデータ生成
x_grid = np.linspace(0.5, 4.0, 50)
y_grid = np.linspace(0.5, 3.5, 50)
X_mesh, Y_mesh = np.meshgrid(x_grid, y_grid)
test_points = np.c_[X_mesh.ravel(), Y_mesh.ravel()]
# 確率予測
pred_probs = prob_model.predict(test_points)
class_probs = pred_probs[:,1].reshape(X_mesh.shape)
# 可視化
plt.contourf(X_mesh, Y_mesh, class_probs, levels=20, cmap='RdBu', alpha=0.7)
plt.colorbar(label='Class 1 Probability')
plt.scatter(points[:,0], points[:,1], c=colors, s=80, edgecolors='k')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.title('Classification Probability Heatmap')
plt.show()