profile-img
The merit of an action lies in finishing it to the end.
slide-image

๋‹ค์ด๋ธŒ ๊ฐ€์„ ๊ธฐ์ˆ˜ 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์œผ๋กœ ๋„ˆ๋ฌด ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ด์„œ ๋” ์ข‹์•„์งˆ ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค!

 

++ ๋”ฅ๋Ÿฌ๋‹ ๊ณต๋ถ€ ์ข€ ํ•ด์•ผ๊ฒ ..๋‹ค

'CS study/๊ธฐํƒ€' Related Articles +