Naver Project (Speech_recognition_Spectrogram)

Jacob Kim·2024년 1월 31일
0

Naver Project Week 2

목록 보기
20/20

Speech spectrogram classification

Spectrogram 데이터를 이용해 음성을 분류하는 모델을 제작해보자.

challenge

Task

  • 1초 길이의 오디오 음성데이터를 이용해 단어를 분류하는 것이 목표입니다.
  • 주어진 데이터를 이용해 딥러닝 트레이닝 과정을 구현해 보는것이 목표입니다.
  • This code is borrowed from Kaggle/TensorFlow Speech Recognition Challenge.
  • This is version 0.01 of the data set containing 64,727 audio files, released on August 3rd 2017.
  • 챌린지에서 사용하는 데이터는 Wave에서 Spectrogram으로 변환된 데이터입니다.

Import packages

  • 우리가 사용할 packages 를 import 하는 부분 입니다.
  • 필요에 따른 packages를 선언합니다.
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

import librosa
import librosa.display
import matplotlib.pyplot as plt

import os
from os.path import isdir, join

import random
import copy

tf.__version__

Setting Dataset

  • Colab 적용을 위한 변수 지정 및 드라이브 마운트
use_colab = True
assert use_colab in [True, False]
from google.colab import drive
drive.mount('/content/drive')
if use_colab:
    DATASET_PATH = "/content/drive/MyDrive/Datasets"
else:
    DATASET_PATH = "./"

Dataset Shape

  • 불러온 데이터셋의 shape을 확인해보자.
data_wav = np.load(os.path.join(DATASET_PATH, "speech_spec_8000.npy"))
print(data_wav.shape)
# 50620, 130, 126, 1
(-1, data_wav.shape[1], data_wav.shape[2], 1)
  • Spectrogram으로 변환한 데이터를 plot 해본다.
librosa.display.specshow(librosa.amplitude_to_db(data_wav[219], ref=np.max), x_axis='time')
plt.title('Power spectrogram')
plt.colorbar(format='%+2.0f dB')
plt.tight_layout()
plt.show()
  • 전체 데이터셋의 wave 데이터를 spectrogram으로 변환한다.

Target_list 설정

  • 데이터셋은 기본적으로 총 12개의 클래스로 나누어져있다
['yes', 'no', 'up', 'down', 'left', 'right', 'on', 'off', 'stop', 'go', 'unknown', 'silence']
  • 해당 클래스로 나누어진 label을 학습 가능한 형태로 처리 후 데이터셋 제작
data_label = np.load(os.path.join(DATASET_PATH, "speech_label_8000.npy"))
print(data_label.shape)
# label 전처리
target_list = ['yes', 'no', 'up', 'down', 'left', 'right', 'on', 'off', 'stop', 'go', 'unknown', 'silence']
##################################################
##### 주어진 label => idx 형태로 변경해주셔야합니다. #####
##################################################
# TODO

Model dataset setting

  • 변환된 데이터를 이용해서 학습에 활용할 데이터셋을 설정한다.
    • data -> data_wav
    • label -> data_label
train_wav, test_wav, train_label, test_label = train_test_split(#)

# reshape for conv layers Conv2D -> 차원이 더 늘어납니다. 데이터 shape도 바뀝니다!
train_wav = train_wav.reshape(# TODO)
test_wav = test_wav.reshape(# TODO)

print(train_wav.shape)
print(test_wav.shape)
print(train_label.shape)
print(test_label.shape)

del data_wav # 메모리 관리를 위해 변수 삭제
del data_label
print('Train_Wav Demension : ' + str(np.shape(train_wav)))
print('Train_Label Demension : ' + str(np.shape(train_label)))
print('Test_Wav Demension : ' + str(np.shape(test_wav)))
print('Test_Label Demension : ' + str(np.shape(test_label)))
print('Number Of Labels : ' + str(len(label_value)))

Hyper-parameters setting

  • 학습 전반에서 사용할 batch size, epoch, checkpoint dir을 설정한다.
# the save point
if use_colab:
    checkpoint_dir ='./drive/MyDrive/train_ckpt/spectrogram/exp1'
    if not os.path.isdir(checkpoint_dir):
        os.makedirs(checkpoint_dir)
else:
    checkpoint_dir = 'spectrogram/exp1'

Dataset 구성

  • 전처리가 완료된 데이터들을 이용해서 Train, Test Dataset을 직접 구성해봅시다.
  • 학습에 사용할 Loss Function의 설정을 고려해 제작
# 전체 데이터셋 구성
batch_size = # TODO

# for train
train_dataset = # TODO
print(train_dataset)

# for test
test_dataset = # TODO
print(test_dataset)

Dataset 구성 검증

#<BatchDataset shapes: ((None, 130, 126, 1), (None, 12)), types: (tf.float32, tf.float32)>
#<BatchDataset shapes: ((None, 130, 126, 1), (None, 12)), types: (tf.float32, tf.float32)>

Model 구현

  • 제시된 모델을 구현해보고, 더 좋은 성능으로 튜닝해보자.

    • inputs = [batch_size, 130, 126, 1]
    • conv1 = [batch_size, 65, 63, 16]
    • conv2 = [batch_size, 33, 32, 32]
    • conv3 = [batch_size, 17, 16, 64]
    • desne = [batch_size, 64]
    • output = [batch_size, 12]
input_tensor = # TODO

x = # TODO
print(x.shape)

output_tensor = # TODO

model = tf.keras.Model(# TODO)
  • 구현된 모델을 어떻게 학습시킬 것인지 구성해봅시다.
model.compile(# TODO)

모델 Output 확인

  • 총 12개의 예측 데이터가 출력되는지 확인해봅시다.
# without training, just inference a model:
predictions = model(train_wav[0:1], training=False)
print("Predictions: ", predictions.numpy())
  • 최종 모델 구성을 확인 후 모델을 저장할 체크포인트를 구성해봅시다.
model.summary()
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_dir,
                                                 save_weights_only=True,
                                                 monitor='val_loss',
                                                 mode='auto', # max, min, auto
                                                 save_best_only=True,
                                                 verbose=1)
# 추가 callback 함수를 구현해보세요!
# TODO

Training

  • 위에서 구현한 데이터셋, 모델들을 fit 함수를 이용해 학습을 시켜봅시다.
# model.fit model.fit_generator는 model.fit으로 통일되었습니다.
# tf.data.Dataset은 generator 입니다.
history = model.fit(# TODO)
  • 학습 결과 확인
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss=history.history['loss']
val_loss=history.history['val_loss']

epochs_range = range(len(acc))

plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

Evaluation

  • Test dataset을 이용해서 모델의 성능을 평가합니다.
model.load_weights(checkpoint_dir)
results = model.evaluate(test_dataset)

스코어 결과

  • 위의 스코어는 분류모델에 적용되는 스코어입니다.
  • 모델의 크기 (MB) 와 정확도를 이용해 스코어를 출력합니다.
def final_score():
    print("Model params num : " + str(model.count_params()))
    print("Accuracy : " + str(results[1]))

    s = (model.count_params() * 32) / (1024 ** 2)
    score = 50 * (results[1] + min((1/s), 1))

    print("score : " + str(score))
final_score()
profile
AI, Information and Communication, Electronics, Computer Science, Bio, Algorithms

0개의 댓글