目次
モデル学習(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モデルの構築
- モデルの学習
- 学習結果の可視化
- テストデータでの評価
- 学習済みモデルの保存