본문 바로가기
고려사이버대학교/Keras

[케라스 7주차] 순환신경망(RNN)과 LSTM 레이어 살펴보기

by 꿈돌이. 2022. 4. 16.

케라스 7주차에서는 순환신경망 레이어, LSTM 모델 구성방법, 간단한 동요악보를 연주하는 것까지가 목표이다. 이번 내용에서는 연주까지 하기에는 길어질 수 있으니 순환신경망과 LSTM 모델 구성방법까지만 알아보도록 하자.

 

 

순환신경망(RNN) 레이어

순환신경망은 순차데이터를 어떻게 활용하느냐에 따라 달라진다. 여기서 순차데이터란, 샘플 간의 시간적(혹은 다르게) 연결이 되어 있는 경우이다.

 

순차데이터_예시

  • 기온 데이터 (28도, 27도, 25도)
  • 체중 데이터 (68kg, 69kg, 70kg)
  • 주식 데이터 (1000, 1200, 1650)
  • 자연어 데이터 (나는 / 오늘 아침 / 학교에 / 갔다)

 

순환신경망 특징

  1. 순차적인 자료에서 규칙적인 패턴을 인식하거나 그 의미를 추론
  2. 순차적이라는 특성 때문에 간단한 레이어로도 다양한 형태의 모델구성 가능 (시계열 분석, 동영상 처리, 자연어 처리)

 

■ 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 = (배치사이즈, 타임스텝, 속성)으로 구성

 

댓글