モデル学習(RNN)

モデル学習(RNN)

このコードブロックでは、RNN(LSTM)を用いた音声分類モデルを構築し、学習・評価・保存を行います。データの前処理(特徴量の整形)を行い、学習データ・検証データ・テストデータに分割してモデルの学習を行います。

1. 必要なライブラリのインポート

import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout, Input
from tensorflow.keras.optimizers import Adam
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
  • tensorflow.keras を使用してRNN(LSTM)モデルを構築
  • train_test_split を用いてデータを訓練・検証・テストデータに分割
  • matplotlib.pyplot を用いて学習結果(損失・精度)の可視化を行う

2. 特徴量データとラベルデータのロード

# データ保存先
DATA_DIR = "./data/"

# 特徴量とラベルをロード
features_path = os.path.join(DATA_DIR, "processed_features.npy")
labels_path = os.path.join(DATA_DIR, "processed_labels.npy")
X = np.load(features_path)
y = np.load(labels_path)
  • 事前に前処理された特徴量データ processed_features.npy をロード
  • ラベルデータ processed_labels.npy をロード
  • これにより、学習に必要なデータを取得

3. データの分割

X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42, stratify=y_temp)
  • データを 訓練(80%)・テスト+検証(20%) に分割
  • さらに、テスト+検証データを 検証(50%)・テスト(50%) に分割
  • stratify=y により、各クラスの比率を保った分割を行う

4. RNN用にデータの形状を変更

X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_val = X_val.reshape((X_val.shape[0], X_val.shape[1], 1))
X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))
  • LSTMは 時系列データ を扱うため、入力形状を [サンプル数, 時系列長, 特徴量数] に変換
  • ここでは、特徴量数は 1(1D配列の形状に変換)

5. モデルの構築

model = Sequential([
    Input(shape=(X_train.shape[1], 1)),  # ここで明示的に入力層を定義
    LSTM(64, return_sequences=True),
    Dropout(0.2),
    LSTM(64, return_sequences=False),
    Dropout(0.2),
    Dense(32, activation='relu'),
    Dense(len(np.unique(y)), activation='softmax')  # クラス数に合わせた出力層
])
  • Sequential() を使用して順次レイヤーを追加
  • 入力層: Input(shape=(X_train.shape[1], 1))
  • LSTM層: 64ユニット × 2層(return_sequences=True で時系列を保持)
  • ドロップアウト: Dropout(0.2)(過学習防止)
  • 全結合層: 32ユニット(ReLU活性化関数)
  • 出力層: クラス数分のニューロン(Softmax活性化関数)

6. モデルのコンパイル

model.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
  • オプティマイザ: Adam(学習率 0.001
  • 損失関数: sparse_categorical_crossentropy(ラベルが整数値の場合)
  • 評価指標: accuracy(分類精度)

7. モデルの学習

history = model.fit(
    X_train, y_train,
    epochs=20,
    batch_size=32,
    validation_data=(X_val, y_val)
)
  • エポック数: 20
  • バッチサイズ: 32
  • 検証データ X_val, y_val を使用して学習を評価

8. 学習曲線の可視化

plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.title('Loss Curve')

plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.title('Accuracy Curve')
plt.show()
  • 損失曲線と精度曲線 をプロットし、学習の収束を確認

9. モデルの評価

loss, accuracy = model.evaluate(X_test, y_test)
print(f"Test Loss: {loss:.4f}")
print(f"Test Accuracy: {accuracy:.4f}")
  • テストデータを用いて最終的な性能を測定(損失と精度)

10. モデルの保存

model.save(os.path.join(DATA_DIR, "rnn_model.keras"))
print("✅ RNN モデルの学習が完了しました。")
  • model.save("rnn_model.keras") によりモデルを保存
  • .keras 形式は推奨される最新の保存形式(従来の .h5 は非推奨)

まとめ

このコードブロックは RNN(LSTM)を用いた音声分類モデル を学習するプロセスを実装しています。

  • データのロード・前処理
  • LSTMモデルの構築
  • モデルの学習
  • 学習結果の可視化
  • テストデータでの評価
  • 学習済みモデルの保存