INDEX
ニューラルネットワークの作成 – TensorFlowとKeras
ディープラーニングは、ニューラルネットワークを使って大量のデータからパターンを学習する手法です。本記事では、PythonのTensorFlowとKerasを使って、シンプルなニューラルネットワークを作成し、実際にデータを学習させる方法を解説します。
Kerasとは
Kerasは、シンプルかつ直感的にニューラルネットワークを作成できる高水準APIです。TensorFlowの上に構築されており、ニューラルネットワークの設計とトレーニングが容易です。
ニューラルネットワークの基本構造
ニューラルネットワークは、入力層・隠れ層・出力層の3つの層で構成されます。それぞれの層には複数のニューロンが含まれ、これらが互いに結びつきながら情報を伝達し、出力を予測します。
ニューラルネットワークの作成手順
ここでは、Kerasを使ってシンプルなニューラルネットワークを構築する手順を紹介します。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
# モデルの定義
# Sequentialモデルは、順にレイヤーを積み重ねるニューラルネットワークを作成するためのクラスです
model = Sequential()
# 入力層と隠れ層の追加(Denseレイヤー)
# Denseレイヤーは全結合層を表し、各ニューロンが前の層のすべてのニューロンに接続します
# units=64 は、層のニューロンの数を表し、活性化関数'relu'は非線形の変換を行います
model.add(Dense(units=64, activation='relu', input_shape=(784,)))
# input_shape=(784,) は入力データの形状を指定。28x28ピクセルの画像を784次元のベクトルに変換することを意味します
# 2番目の隠れ層。再度64ユニットのニューロンを持ち、relu活性化関数を使用します
model.add(Dense(units=64, activation='relu'))
# 出力層
# 出力層のユニット数は分類するクラスの数に対応します。ここでは10種類の数字(0~9)を分類するため、units=10
# 'softmax'は多クラス分類に適した活性化関数です。クラスごとの確率を出力します
model.add(Dense(units=10, activation='softmax'))
# モデルのコンパイル
# 損失関数(loss)は、モデルの予測と実際の値の誤差を評価します。ここでは 'categorical_crossentropy' が用いられ、多クラス分類に適しています
# 最適化アルゴリズム(optimizer)は、Adamを使用。Adamは、学習率の自動調整機能を持つ最適化手法です
# metrics=['accuracy'] は、モデルの精度を学習時に追跡します
model.compile(loss='categorical_crossentropy',
optimizer=Adam(),
metrics=['accuracy'])
# モデルの概要を表示
# モデル構造や各層のニューロン数などを表示します
model.summary()
# コメント:
# - Sequential: モデルの層を順に積み重ねる簡単なネットワーク
# - Denseレイヤー: 全結合層で、各ニューロンが前の層の全ニューロンと結合
# - relu: 活性化関数で、負の値を0にし、非線形性を導入
# - softmax: 出力層でクラスごとの確率を計算し、合計が1となる
# - categorical_crossentropy: 多クラス分類タスクに適した損失関数
# - Adam: 学習率を自動調整する最適化アルゴリズム
ニューラルネットワークのトレーニング
次に、構築したニューラルネットワークをトレーニング(学習)させます。今回は、MNISTデータセット(手書き数字のデータセット)を使います。
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# MNISTデータセットの読み込み
# load_data() は訓練用とテスト用のデータを返します。X_train, y_train は訓練データ、X_test, y_test はテストデータ
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# データの前処理
# 画像データは28x28ピクセルなので、これを784次元の1次元ベクトルに変換し、float32型にキャストしてから、255で割って0~1の範囲に正規化
X_train = X_train.reshape(-1, 784).astype('float32') / 255
X_test = X_test.reshape(-1, 784).astype('float32') / 255
# ラベルをone-hotエンコーディングに変換
# 例えば、数字3は [0, 0, 0, 1, 0, 0, 0, 0, 0, 0] のように表現されます
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# モデルのトレーニング
# fit() メソッドで訓練データを使ってモデルを学習させます。エポック数は10回、バッチサイズは32に設定
# validation_data を指定することで、訓練時にテストデータでの精度も計測します
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))
# モデルの評価
# evaluate() でテストデータを使って学習済みモデルの性能を評価します
# 戻り値として損失と精度が返されます
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"テストデータでの正解率: {test_acc * 100:.2f}%")
# コメント:
# - mnist.load_data(): 訓練とテスト用のデータをロード
# - reshape: 画像データを1次元配列に変換
# - to_categorical: ラベルをone-hot形式に変換
# - model.fit(): モデルの学習。エポック数とバッチサイズは性能に影響を与える重要なパラメータ
# - model.evaluate(): 学習後のモデルをテストデータで評価
ニューラルネットワークの可視化
学習の過程や結果を視覚化することも重要です。Kerasでは、トレーニング中の精度や損失を記録し、それをグラフとして表示することができます。
import matplotlib.pyplot as plt
# トレーニングの履歴を可視化
# fit() メソッドは学習の履歴を返すので、これを使って損失や精度をプロットします
history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))
# 損失のプロット
# history.history['loss'] にエポックごとの損失が記録されます
plt.plot(history.history['loss'], label='訓練損失')
plt.plot(history.history['val_loss'], label='検証損失')
plt.title('損失の推移')
plt.xlabel('エポック')
plt.ylabel('損失')
plt.legend()
plt.show()
# 正解率のプロット
# history.history['accuracy'] にエポックごとの精度が記録されます
plt.plot(history.history['accuracy'], label='訓練精度')
plt.plot(history.history['val_accuracy'], label='検証精度')
plt.title('正解率の推移')
plt.xlabel('エポック')
plt.ylabel('精度')
plt.legend()
plt.show()
# コメント:
# - history: fit() メソッドの結果で、学習過程での損失や精度が含まれています
# - plt.plot: Matplotlibでグラフを描画。学習の過程を視覚的に確認でき、過学習の兆候などもチェック可能
まとめ
TensorFlowとKerasを使用して、シンプルなニューラルネットワークを構築し、データセットを使って学習させる方法を解説しました。ニューラルネットワークは多層構造を持ち、適切な活性化関数や最適化アルゴリズムを選ぶことが重要です。Kerasを使えば、モデルの構築とトレーニングが直感的に行え、可視化によってトレーニングの進行状況を把握することも可能です。