๋ค์ด๋ธ ๊ฐ์ ๊ธฐ์ 2์ฃผ์ฐจ ๊ณผ์ - Audio Classification Model (์ค๋์ค ๋ถ๋ฅ ๋ชจ๋ธ) ๋ง๋ค๊ธฐ ๊ณผ์ ํ๋ ๊ณผ์
๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ๋ค.
์ฐ์ , ๋๋ ๋ฅ๋ฌ๋์ ๊ทธ๋ ๊ฒ ์ ์๋ ํธ์ ์๋๋ผ์ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ์๊ณ
๊ทธ ๊ณผ์ ์์ ์ฑํ๋ ๊ฒ์ด ๋ฐ๋ก CNN ๋ชจ๋ธ์ด๋ค.
Tensorflow๋ฅผ ์ด์ฉํ์๋ค. (ํ๊ต์์ ์ํค๋ ๊ณผ์ ๋ ํ์ดํ ์น๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์,, ํ ์ํ๋ก์ฐ๋ ์ฒ์์ด๋ค)
1) ์ค๋์ค ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
์ฌ์ฉํ ๋ฐ์ดํฐ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
14๊ฐ์ ์ ๊ธฐ๋ค๋ณ ์๋ฆฌ๊ฐ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ์ ์ ๋๋ค. ์ค๋์ค๋ฅผ MFCC ๊ณ์์ ๊ฐ์๋ฅผ 13๊ฐ๋ก ์ค์ ํ MFCC ํํ๋ก ์ ์ฒ๋ฆฌํ์ผ๋ฉฐ ์ ์ฒ๋ฆฌ ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค. ์ ์ฒด ๋ฐ์ดํฐ์ ์์ ๋ฌด์์๋ก ํ๋์ ์ ๊ธฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ํด๋น ์ ๊ธฐ ๋ ์ด๋ธ์ ๋ฐ์ดํฐ ์ค ๋๋คํ๊ฒ ํ์ผ์ ๊ณจ๋ผ ๊ทธ ์์ฑ ํ์ผ ๋ด์์ ๊ณต๋ฐฑ ๋ถ๋ถ์ ์ ์ธํ๊ณ 0.5์ด๋ฅผ ์ํ๋งํ๋ ๊ณผ์ ์ ์ ์ฒด ๋ฐ์ดํฐ์ ์ ๋ํด 56789๋ฒ ๋ฐ๋ณตํ์ต๋๋ค. ๋ฐ์ดํฐ์ ํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฐ์ดํฐ๋ ์ด๋ค ์ ๊ทํ๋ ํ์คํ๋ ๊ฑฐ์น์ง ์์์ต๋๋ค.
๋ฐ์ดํฐ์ ํํ๋ ๋ํ์ด๋ก ์ ์ฅ๋์ด ์์๊ธฐ ๋๋ฌธ์ ๋ํ์ด๋ฅผ ์ด์ฉํด ๋ถ๋ฌ์์ค๋ค.
import numpy as np
Xdata = np.load("Xdata.npy")
ydata = np.load("ydata.npy")
๊ทธ ํ, ํ์ํ ๋ชจ๋๋ค์ ์ํฌํธ ํด์จ๋ค.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split
2) ์ ๊ทํ ์งํ ๋ฐ ๋ฐ์ดํฐ ๋ถํ
๋ํ์ด ๋ฐฐ์ด ํํ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒ๋ฆฌ๋ก ๊ฐ๋จํ๊ฒ ์ ๊ทํ๋ฅผ ์งํํด ๋ณด์๋ค.
Xdata_normalized = (Xdata - np.mean(Xdata)) / np.std(Xdata)
๋ํ ํ์ต๊ณผ ํ ์คํธ ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ๋ฅผ ์ํด train_test_split์ ์ด์ฉํ์๋ค.
X_train, X_test, y_train, y_test = train_test_split(Xdata_normalized, ydata, test_size = 0.2, random_state = 42)
3) ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
model = tf.keras.Sequential([
tf.keras.layers.Conv1D(64, kernel_size=3, activation='relu', input_shape=X_train.shape[1:]),
tf.keras.layers.MaxPooling1D(pool_size=2),
tf.keras.layers.Conv1D(128, kernel_size=3, activation='relu'),
tf.keras.layers.MaxPooling1D(pool_size=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(y_train.shape[1], activation='softmax')
])
์ผ๋ผ์ค๋ฅผ ์ด์ฉํ์ฌ CNN ์ธต์ ์์์ค๋ค. ๊ณผ์ ํฉ ๋ฐฉ์ง์ฉ์ผ๋ก Dropout์ ์ด์ฉํ๋ค.
์ธต์ ์๋ ๊ธฐ์ค์ด๋ผ ํ๋ค๋ฉด ์ฌ์ค ์ ๋ชจ๋ฅด๊ฒ ๊ณ ์ด๊ฒ์ ๊ฒ ์กฐํฉํด๋ณด์๋ค.
# ๋ชจ๋ธ ์ปดํ์ผ
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# ๋ชจ๋ธ ํ์ต
history = model.fit(X_train, y_train, epochs=50, batch_size=64)
๋ชจ๋ธ ํ์ต์ ์์ ๊ฐ์ด ์งํํ๋ค. ์ํฌํฌ ์๋ ์ฒ์์ 20์ผ๋ก ํ๋ค๊ฐ ์๋ ด์ด ์๋๊ธธ๋ ๋ ํฌ๊ฒ ํด์คฌ๋ค.
4) ์ฑ๋ฅ ํ ์คํธ
Epoch 50/50 688/688 [==============================] - 7s 11ms/step - loss: 0.2341 - accuracy: 0.9247
ํ์ต ๊ฒฐ๊ณผ ์ ํ๋๊ฐ 0.9247์ด์๋ค.
๋ ํ์ต์ํค๋ฉด ์์ ์๋ ดํ ๊ฒ ๊ฐ์ง๋ง ์๊ฐ๊ด๊ณ์..
Test ๋ฐ์ดํฐ์ ์ผ๋ก ๋ค์ ํ๊ฐํ์ ๋ ๊ฒฐ๊ณผ๋ accuracy: 0.8739 ์ด์๋ค. ์ฝ๊ฐ ๊ณผ์ ํฉ์ด ๋ ๊ฑธ๊น?.? ์ถ๊ธฐ๋...
๋ค๋ฅธ ํ์์ LSTM์ผ๋ก ํ๊ณ ๋๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ LSTM์ด ๋ ์ฑ๋ฅ์ด ์ข๋ค๊ณ ์๊ณ ์๋๋ฐ ์ด๋ฏธ CNN์ผ๋ก ๋๋ฌด ์ข์ ์ฑ๋ฅ์ ๋ด์ ๋ ์ข์์ง ์ ์์์ง ๊ถ๊ธํด์ก๋ค!
++ ๋ฅ๋ฌ๋ ๊ณต๋ถ ์ข ํด์ผ๊ฒ ..๋ค