고려사이버대학교/Keras
[케라스 7주차] 순환신경망(RNN)과 LSTM 레이어 살펴보기
꿈돌이.
2022. 4. 16. 20:39
케라스 7주차에서는 순환신경망 레이어, LSTM 모델 구성방법, 간단한 동요악보를 연주하는 것까지가 목표이다. 이번 내용에서는 연주까지 하기에는 길어질 수 있으니 순환신경망과 LSTM 모델 구성방법까지만 알아보도록 하자.
순환신경망(RNN) 레이어
순환신경망은 순차데이터를 어떻게 활용하느냐에 따라 달라진다. 여기서 순차데이터란, 샘플 간의 시간적(혹은 다르게) 연결이 되어 있는 경우이다.
순차데이터_예시
- 기온 데이터 (28도, 27도, 25도)
- 체중 데이터 (68kg, 69kg, 70kg)
- 주식 데이터 (1000, 1200, 1650)
- 자연어 데이터 (나는 / 오늘 아침 / 학교에 / 갔다)
순환신경망 특징
- 순차적인 자료에서 규칙적인 패턴을 인식하거나 그 의미를 추론
- 순차적이라는 특성 때문에 간단한 레이어로도 다양한 형태의 모델구성 가능 (시계열 분석, 동영상 처리, 자연어 처리)
■ LSTM (Long Shot-Term Memory units) 레이어
LSTM(3, input_dim=1, input_length=4)
첫번째 인자 : 메모리 셀의 개수 (3개)
input_dim : 입력 속성 수 (1개)
input_length : 시퀀스 데이터의 입력 길이
return_sequences = False
return_sequences : 시퀀스 출력 여부
- False : 마지막 시퀀스에서 한번만 출력
- True : 각 시퀀스에서 출력 (LSTM 레이어를 여러 개로 쌓아 올릴 때는 True 옵션사용)
순환신경망 모델 구성방법
■ 시퀀스 데이터 준비
시퀀스 데이터로 나비야 동요를 준비한다. 12개 경우의 수로 간단하게 학습해볼 동요로 나비야가 적합하다.
■ 데이터셋 생성 (코드화)
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'}
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']
먼저 악보를 코드화 시킨다. 악보 14개를 코드화 해서 코드를 인덱스, 인덱스를 코드로 바꿔준다.
■ 다층 퍼셉트론 모델
modelmodel = Sequential()
model.add(Dense 128, input_dim=4, activation='relu'))
model.add(Dense 128, activation='relu'))
model.add(Dense(one_hot_vec_size, activation='softmax'))
Dense 레이어 : 3개
input_dim (입력 속성) : 4개
softmax : 출력층
■ 기본 LSTM 모델
model = Sequential()
model.add(LSTM(128, input_shape = (4, 1)))
model.add(Dense(one_hot_vec_size, activation='softmax')
- 128 메모리 셀을 가진 LSTM 레이어 1개와 Dense 레이어로 구성
- 입력은 샘플 50개, 타임스텝 4개, 속성 1개로 구성
- 상태유지(stateful) 모드 비활성화
샘플 구성
x_train = np.reshape(x_train, (50, 4, 1))
샘플 수, 타임스텝 수, 속성 수 (3차원)
타임스텝 : input_length와 동일하게 맞춤
입력 속성이 여러 개인 모델구성
model = Sequential()
model.add(LSTM(128, batch_input_shape = (1, 4, 2), stateful=True))
model.add(Dense(one_hot_vec_size, activation='softmax'))
- 상태유지(stateful) LSTM 모델을 생성하기 위해서 LSTM 레이어 생성 시, stateful=True로 설정한다.
- batch_input_shape = (배치사이즈, 타임스텝, 속성)으로 구성