前回のおさらいと今回のテーマ
こんにちは!前回は、モデルの性能を最大化するためのハイパーパラメータチューニングについて解説しました。グリッドサーチを使って最適なハイパーパラメータを見つけることで、モデルの精度を大幅に向上させることができましたね。
今回は、AI開発の核心とも言えるニューラルネットワークの基本的な構築方法について学びます。ニューラルネットワークは、ディープラーニングの基礎となるモデルであり、画像認識、自然言語処理、予測分析など、様々な分野で活用されています。今回は、PythonのライブラリであるKerasを使って、シンプルなニューラルネットワークを実装し、その動作を理解していきましょう。
ニューラルネットワークとは?
ニューラルネットワークは、人間の脳の神経細胞(ニューロン)を模したアルゴリズムで、データからパターンを学習し、予測や分類を行うモデルです。ニューラルネットワークの基本構成は以下の3つの層から成り立っています。
- 入力層(Input Layer): データの特徴量が入力される層。
- 隠れ層(Hidden Layer): 入力を処理し、特徴を抽出する層。通常、複数の隠れ層を積み重ねて構築されます。
- 出力層(Output Layer): モデルの最終的な出力を決定する層。
各層のニューロン(ノード)は、前の層のニューロンと接続されており、これらの接続には重み(weight)が設定されています。ニューラルネットワークは、この重みを最適化することでデータのパターンを学習し、予測を行います。
Kerasを使ったニューラルネットワークの構築
Pythonでニューラルネットワークを構築する際には、Kerasが非常に便利です。Kerasは、TensorFlowの上で動作する高レベルのニューラルネットワークライブラリで、シンプルなコードでニューラルネットワークを定義、訓練、評価できます。
1. 必要なライブラリのインストールとインポート
まず、KerasとTensorFlowをインストールします。KerasはTensorFlowに統合されているため、TensorFlowをインストールするだけでKerasも利用できます。
pip install tensorflow
次に、ライブラリをインポートします。
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
2. データセットの準備
今回は、Kerasに組み込まれているMNIST
データセットを使って、手書き数字の画像を分類するモデルを構築します。MNIST
は0から9までの手書き数字画像(28×28ピクセル)が含まれており、画像分類の基本を学ぶのに最適なデータセットです。
# データセットの読み込み
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# データの正規化(0-255の値を0-1にスケーリング)
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
# 画像データを1次元に変換(28x28 -> 784)
x_train = x_train.reshape((-1, 784))
x_test = x_test.reshape((-1, 784))
# ラベルデータをカテゴリカル(one-hot)に変換
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
- データの正規化: 画像のピクセル値(0〜255)を0〜1にスケーリングします。
- データの形状変換: 28×28ピクセルの2次元データを784次元の1次元データに変換します。
- ラベルのone-hotエンコーディング: 出力層が10クラス(0〜9)の分類を行うため、ラベルをone-hotベクトルに変換します。
3. ニューラルネットワークの構築
次に、Kerasを使ってシンプルなニューラルネットワークを構築します。ここでは、入力層、隠れ層、出力層を順に定義します。
# モデルの定義
model = keras.Sequential([
layers.Dense(128, activation='relu', input_shape=(784,)), # 隠れ層1
layers.Dense(64, activation='relu'), # 隠れ層2
layers.Dense(10, activation='softmax') # 出力層
])
- Sequential: 順に層を積み重ねていくモデルを定義します。
- Dense: 全結合層(fully connected layer)を定義します。
units
はニューロンの数、activation
は活性化関数です。 - ReLU(Rectified Linear Unit): 隠れ層に使用される一般的な活性化関数で、非線形性を導入します。
- Softmax: 出力層に使用され、クラスの確率分布を出力します。
4. モデルのコンパイル
モデルをコンパイルして、損失関数、最適化アルゴリズム、評価指標を設定します。
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
- optimizer=’adam’: Adamは一般的に使われる最適化アルゴリズムで、学習速度と収束性が高いです。
- loss=’categorical_crossentropy’: 多クラス分類問題の損失関数として
categorical_crossentropy
を使用します。 - metrics=[‘accuracy’]: モデルの性能を正解率で評価します。
5. モデルの訓練
モデルを訓練するために、訓練データとテストデータを指定して、学習を開始します。
history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
- epochs=10: 訓練データを10回繰り返して学習します。
- batch_size=32: 1回の更新で使用するサンプル数です。
- validation_split=0.2: 訓練データの20%を検証データとして使用します。
6. モデルの評価
訓練が完了したら、テストデータを使ってモデルの性能を評価します。
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_accuracy:.2f}")
- evaluate(): テストデータを使って損失値と精度を計算します。
7. モデルの予測
実際にテストデータで予測を行い、その結果を確認します。
predictions = model.predict(x_test)
# 最初の5つの予測結果を表示
for i in range(5):
print(f"Actual: {np.argmax(y_test[i])}, Predicted: {np.argmax(predictions[i])}")
- predict(): モデルがテストデータを使って予測を行います。
- np.argmax(): one-hotエンコーディングされた出力を元のクラスに変換します。
まとめ
今回は、Kerasを使って基本的なニューラルネットワークを構築する方法を解説しました。入力層から出力層までの各層を定義し、訓練から評価まで一通りの流れを体験することで、ニューラルネットワークの基礎を理解できたと思います。KerasのシンプルなAPIを使うことで、複雑なモデルの構築も非常に簡単に行えるので、ぜひ他のデータセットでも試してみてください。
次回予告
次回は、TensorFlow入門として、ディープラーニングフレームワークであるTensorFlowの基本について解説します。TensorFlowを使って、より高度なニューラルネットワークの構築を学びましょう!
注釈
- ReLU: Rectified Linear Unitの略で、ニューラルネットワークの活性化関数として広く使われています。非線形性を導入するため、隠れ層に適しています。
- Softmax: 出力層に使用され、各クラスの確率を出力するための関数です。多クラス分類問題でよく使われます。
コメント