TensorFlowで始めるニューラルネットワーク:単層から多層構造へ

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()

タグ: TensorFlow Keras ニューラルネットワーク 深層学習 分類問題

7月7日 20:11 投稿