첫번째 캐글 : 텐서플로 음성 인식 경진 대회
www.kaggle.com/c/tensorflow-speech-recognition-challenge
TensorFlow Speech Recognition Challenge
Can you build an algorithm that understands simple speech commands?
www.kaggle.com
1. mell, mfcc
이 캐글은 음성신호를 다룬다. 따라서 데이터 전처리 과정에서 mell과 mfcc를 사용하였다.
mfcc란 오디오 신호에서 추출할 수 있는 피쳐이며 소리의 고유한 특징을 나타낸다.
주로 음성인식, 화자인식, 음성합성, 음악 장르 분류등의 오디오 도메인에 사용된다.
mfcc의 추출은 아래 사진과 같다.
오디오 신호를 프레임별로 나누어 Fast Fourier Transform(FFT)를 이용해 스펙트럼을 구하고, 그 스팩트럼에 Mel Filter Bank를 적용하여 Mel Spectrum을 구한다. 그리고 여기에 Cepstral 분석을 적용해 MFCC를 구한다.
스펙트럼을 구하게 되면 주파수로 변환됨으로 각 주파수의 대역대별 세기를 알 수 있고 어떤 주파수가 강하고 약한지를 알 수 있게 된다. 또한 악기소리나 사람의 음성은 harmonic 구조를 가지게 되고 이것은 악기나 성대의 구조마다 달라지게 된다. 그래서 이것을 추출하는 방법이 Cepstral 분석이다.
Cepstral 분석의 수행과정을 보자. 아래의 일반적인 스펙트럼에서
각각의 피크들을 Formants라고 한다. 이곳은 harmonic과 만나 소리가 풍성하게 되는 필터역할을 하게 된다. 이것을 연결한 곡선을 스펙트럼과 분리해야 하는 것이 Cepstral 분석이다. 이때 필요한 것이 log와 IFFT이다.
MFCC는 일반적인 스펙트럼이 아닌 Mel Spectrum에서 Cepstral분석으로 추출한다. Mel specturm은 사람을 중심으로 한것인데 저주파수 대역에서 더 민감한 사람의 청각 특성을 이용해 실제 사람이 인식하는 주파수와 물리적 주파수의 관계를 표현한 것이다.
아래는 실제로 같은 음성파일을 이용해서 스펙토그램, 로그 스펙토그램, 멜 스펙토그램, MFCC를 나타낸 것이다.
2. listdir
특정 파일 리스트를 가져와서 사용할 수 있다.
cf) glob도 마찬가지로 파일 가져오는거
listdir는 해당 디렉토리의 파일명만 가져오지만 glob은 검색시 사용했던 경로명까지 다 가져온다.
3. librosa.load, scipy.io.wavfile.read
wav 파일을 읽고 데이터를 살펴볼 수 있다.
다만 librosa로 데이터를 읽으면 데이터의 범위가 -1~1의 범위로 정규화 된다.
4. zip
동등한 갯수로 이루어진 자료형을 묶어준다. 예를들어
Number = [1,2,3,4]
Name = ['hong', 'ahn', 'lee', 'kim'] 이고 zip(Number, Name)으로 묶으면
(1, 'hong'), (2, 'ahn')... 으로 나오게 된다.
이것을 enumerate에 넣어서 for문에서 사용해도 된다.
5. state_dict
파이토치에서 torch.nn.Module이 들어간 모델에서 사용할 수 있다. 모델의 가중치를 저장하는데 아래 3가지 함수가 필요하다.
1. torch.save(obj, path) : 전체 모델을 저장하거나 모델의 state_dict을 저장할 때 사용한다.
PATH = './weights/'
torch.save(model, PATH + 'model.pt') # 전체 모델 저장
torch.save(model.state_dict(), PATH + 'model_state_dict.pt') # 모델 객체의 state_dict 저장
torch.save({
'model': model.state_dict(),
'optimizer': optimizer.state_dict()
}, PATH + 'all.tar') # 여러 가지 값 저장, 학습 중 진행 상황 저장을 위해 epoch, loss 값 등 일반 scalar값 저장 가능
2. torch.load(path) : 전체 모델을 불러오거나 모델의 state_dict을 불러온다.
3. torch.nn.Module.loadstatedict(dict): state_dict을 이용해 저장한 모델을 불러온다.
model.train(), model.eval()로 불러온 모델을 사용할것인지 말지를 정한다.
model.load_state_dict(checkpoint['model'])
optimizer.load_state_dict(checkpoint['optimizer'])이런식으로 사용한다.
6. add_module
self.add_module("name", module)을 하면 따로 안적어도 모델내에 저장가능하다.
여러개의 layer를 저장할때 사용된다.
불러올때는 getattr(self, "불러올 이름")으로 가져오면 된다.