티스토리 뷰
케라스를 이용하여 간단한 RNN, LSTM 모델을 설계해보겠습니다.
시계열 데이터 분석에 중요한 RNN, LSTM의 기본 구조를 활용하여 간단하게 구현만 해보았습니다.
(참고 : 핸즈온 머신러닝 2판)
import tensorflow as tf
"""
간단한 RNN 구조
keras의 SimpleRNN 에서는 기본적으로 tanh를 활성화 함수로 사용
RNN의 경우 입력 데이터의 길이에 상관 없이 time step 처리할 수 있기 때문에 input_shape=[None, 1]
return_sequence=True : time step마다 출력 return
하지 않으면 마지막 time step의 결과만 출력
다음 layer를 RNN 구조 이용하려면 return_sequence=True 해야함
마무리로 Dense 사용한 것 : SimpleRNN은 tanh를 활성화 함수로 이용하기에 결과는 -1, 1 사이
다른 활성화 함수 사용하거나 더 빠른 계산 위해 Dense 사용
"""
model = tf.keras.models.Sequential([
tf.keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None, 1]),
tf.keras.layers.SimpleRNN(20),
tf.keras.layers.Dense(1)
])
"""
LSTM (장단기 메모리 셀) 기본 구조
데이터의 장기간 의존성을 위해 사용
TimeDistributed : 입력 층의 모든 time step에 (...)의 내용을 적용 => 각 time step을 별개의 샘플로 다룰 때 효과적
"""
model2 = tf.keras.models.Sequential([
tf.keras.layers.LSTM(20, return_sequences=True, input_shape=[None, 1]),
tf.keras.layers.LSTM(20, return_sequences=True),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(10))
])
"""
1D Conv 이용해 sequence 처리하기
1D Conv 층을 이용해 커널로 슬라이딩하며 특성을 골라냄 (1D 특성 맵)
strides, padding을 이용해 적절한 타깃을 만들어야 한다.
모델의 중요하지 않은 정보를 버리고 중요 정보만 LSTM, GRU 층으로 넘기려면
합성곱(Conv)으로 sequence 길이 줄여야 함 (ex) kernel_size=4, strides=2, padding="valid" => 반으로 다운 샘플링
"""
model3 = tf.keras.models.Sequential([
tf.keras.layers.Conv1D(filters=20, kernel_size=4, strides=2, padding="valid", input_shape=[None, 1]),
tf.keras.layers.GRU(20, return_sequences=True),
tf.keras.layers.GRU(20, return_sequences=True),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(10))
])
이후 추가적으로 셰익스피어 문체 생성을 해볼 예정입니다.
'딥러닝' 카테고리의 다른 글
keras를 활용한 MNIST 모델 훈련시키기 (기본) (0) | 2021.03.09 |
---|---|
밑바닥부터 시작하는 딥러닝 2권 후기 및 앞으로 계획 (0) | 2021.02.19 |
기울기 클리핑 / 기본적인 LSTM (0) | 2021.01.29 |
BPTT (0) | 2021.01.29 |
네거티브 샘플링 (0) | 2021.01.27 |
댓글