SMALL
2020. 1. 7. 15:36에 작성했던 글입니다.
RNN(Recurrent Neural Network)은 시간의 흐름에 따라 변화하는 데이터를 학습하기 위한 인공신경망 이며, 과거의 출력 데이터를 재귀적으로 참조한다.
LSTM (Long Short-Term Memory units) 레이어
LSTM(3, input_dim=1)
-
첫번째 인자 : 메모리 셀의 개수.
-
input_dim : 입력 속성 수.
LSTM 레이어를 이용하여 몇가지 순환 신경망 모델을 만들어보고, 각 모델에 “나비야” 동요를 학습시키는 예제
코드 정의
-
c(도), d(레), e(미), f(파), g(솔), a(라), b(시)
-
4(4분음표), 8(8분음표)
전체코드
# 0. 사용할 패키지 불러오기
import keras
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from keras.utils import np_utils
# 랜덤시드 고정시키기
np.random.seed(5)
# 손실 이력 클래스 정의
class LossHistory(keras.callbacks.Callback):
def init(self):
self.losses = []
def on_epoch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
# 데이터셋 생성 함수
def seq2dataset(seq, window_size):
dataset_X = []
dataset_Y = []
for i in range(len(seq)-window_size):
subset = seq[i:(i+window_size+1)]
for si in range(len(subset)-1):
features = code2features(subset[si])
dataset_X.append(features)
dataset_Y.append([code2idx[subset[window_size]]])
return np.array(dataset_X), np.array(dataset_Y)
# 속성 변환 함수
def code2features(code):
features = []
features.append(code2scale[code[0]]/float(max_scale_value))
features.append(code2length[code[1]])
return features
# 1. 데이터 준비하기
# 코드 사전 정의
code2scale = {'c':0, 'd':1, 'e':2, 'f':3, 'g':4, 'a':5, 'b':6}
code2length = {'4':0, '8':1}
code2idx = {'c4':0, 'd4':1, 'e4':2, 'f4':3, 'g4':4, 'a4':5, 'b4':6,
'c8':7, 'd8':8, 'e8':9, 'f8':10, 'g8':11, 'a8':12, 'b8':13}
idx2code = {0:'c4', 1:'d4', 2:'e4', 3:'f4', 4:'g4', 5:'a4', 6:'b4',
7:'c8', 8:'d8', 9:'e8', 10:'f8', 11:'g8', 12:'a8', 13:'b8'}
max_scale_value = 6.0
# 시퀀스 데이터 정의
seq = ['g8', 'e8', 'e4', 'f8', 'd8', 'd4', 'c8', 'd8', 'e8', 'f8', 'g8', 'g8', 'g4',
'g8', 'e8', 'e8', 'e8', 'f8', 'd8', 'd4', 'c8', 'e8', 'g8', 'g8', 'e8', 'e8', 'e4',
'd8', 'd8', 'd8', 'd8', 'd8', 'e8', 'f4', 'e8', 'e8', 'e8', 'e8', 'e8', 'f8', 'g4',
'g8', 'e8', 'e4', 'f8', 'd8', 'd4', 'c8', 'e8', 'g8', 'g8', 'e8', 'e8', 'e4']
# 2. 데이터셋 생성하기
x_train, y_train = seq2dataset(seq, window_size = 4)
# 입력을 (샘플 수, 타임스텝, 특성 수)로 형태 변환
x_train = np.reshape(x_train, (50, 4, 2))
# 라벨값에 대한 one-hot 인코딩 수행
y_train = np_utils.to_categorical(y_train)
one_hot_vec_size = y_train.shape[1]
print("one hot encoding vector size is ", one_hot_vec_size)
# 3. 모델 구성하기
model = Sequential()
model.add(LSTM(128, batch_input_shape = (1, 4, 2), stateful=True))
model.add(Dense(one_hot_vec_size, activation='softmax'))
# 4. 모델 학습과정 설정하기
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 5. 모델 학습시키기
num_epochs = 2000
history = LossHistory() # 손실 이력 객체 생성
history.init()
for epoch_idx in range(num_epochs):
print ('epochs : ' + str(epoch_idx) )
model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2, shuffle=False, callbacks=[history]) # 50 is X.shape[0]
model.reset_states()
# 6. 학습과정 살펴보기
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(history.losses)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train'], loc='upper left')
plt.show()
# 7. 모델 평가하기
scores = model.evaluate(x_train, y_train, batch_size=1)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))
model.reset_states()
# 8. 모델 사용하기
pred_count = 50 # 최대 예측 개수 정의
# 한 스텝 예측
seq_out = ['g8', 'e8', 'e4', 'f8']
pred_out = model.predict(x_train, batch_size=1)
for i in range(pred_count):
idx = np.argmax(pred_out[i]) # one-hot 인코딩을 인덱스 값으로 변환
seq_out.append(idx2code[idx]) # seq_out는 최종 악보이므로 인덱스 값을 코드로 변환하여 저장
print("one step prediction : ", seq_out)
model.reset_states()
# 곡 전체 예측
seq_in = ['g8', 'e8', 'e4', 'f8']
seq_out = seq_in
seq_in_featrues = []
for si in seq_in:
features = code2features(si)
seq_in_featrues.append(features)
for i in range(pred_count):
sample_in = np.array(seq_in_featrues)
sample_in = np.reshape(sample_in, (1, 4, 2)) # 샘플 수, 타입스텝 수, 속성 수
pred_out = model.predict(sample_in)
idx = np.argmax(pred_out)
seq_out.append(idx2code[idx])
features = code2features(idx2code[idx])
seq_in_featrues.append(features)
seq_in_featrues.pop(0)
model.reset_states()
print("full song prediction : ", seq_out)
BIG
'AI' 카테고리의 다른 글
DeepMind, 프로그래밍 하는 AlphaCode AI 공개 (0) | 2023.02.06 |
---|---|
Keras 컨볼루션 신경망 (0) | 2023.02.03 |
Keras 다층 퍼셉트론 레이어 (딥러닝 라이브러리 ) (1) | 2023.02.03 |
Keras 숫자 인식 샘플 (딥러닝 라이브러리 ) (0) | 2023.02.03 |
Keras 개요 및 개념 잡기 (딥러닝 라이브러리 ) (1) | 2023.02.03 |