You are on page 1of 13

Kumoh National Institute of Technology

딥러닝 (Deep Learning)


RNN 구조 유형

컴퓨터공학과 황준하
Contents

1. RNN 구조 유형

2. One-to-One 구조

3. Many-to-One 구조

4. One-to-Many 구조

5. Many-to-Many (1) 구조

6. Many-to-Many (2) 구조

2/12
RNN 구조 유형
1. RNN 구조 유형

RNN 사용 이유 ( 정리 )
 이전 입력에 대한 결과가 다음 입력 값에 영향을 줌
 비슷한 두 문장이 입력되었을 때 차이를 구별하여 출력
값에 반영

3/12
RNN 구조 유형
1. RNN 구조 유형

RNN 구조 유형
 단일 입력 단일 출력 (One-to-One)
◦ 순서 문제 아님  RNN 레이어를 사용하지 못할 이유는 없음
 다수 입력 단일 출력 (Many-to-Many)
RNN 구조는 대상 문제 및
 단일 입력 다수 출력 (One-to-Many) 설계에 따라 달라짐
 다수 입력 다수 출력 (1) (Many-to-Many(1))
 다수 입력 다수 출력 (2) (Many-to-Many(2)) : Seq2Seq 구조와 유사
(2) (1)

Tensorflow 구현 시 x, y 데이터 구조에 주의


4/12
RNN 구조 유형
2. One-to-One 구조

One-to-One 구조
 일반적인 FCNN 에서 Dense 레이어 대신 RNN 레이어
(LSTM 등 ) 를 사용할 수 있음
◦ 효과 ?
 프로그램
◦ 08_3_1_RNN One-to-One.ipynb
◦ 데이터 shape 주의
# x 데이터 : (4, 1, 2) 시퀀스 길이가 1, 속성 2 개
x_train = np.array([[[0, 0]], [[0, 1]], [[1, 0]], [[1,
1]]])
# y 데이터 : (4, 1) 속성 1 개
y_train = np.array([[0], [1], [1], [0]])
# y 데이터 : (4, 1, 1) 가능 , 시퀀스 길이가 1, 속성 1 개
# y_train = np.array([[[0]], [[1]], [[1]], [[0]]])
5/12
RNN 구조 유형
3. Many-to-One 구조

Many-to-One 구조
 예
◦ 시계열 데이터 예측
◦ 언어 분류 : 긍정 / 부정 , 감성

6/12
RNN 구조 유형
4. One-to-Many 구조

One-to-Many 구조
 예 ) 이미지 캡션닝

7/12
RNN 구조 유형
4. One-to-Many 구조

One-to-Many 구조 예제 x y
[1] [[2], [3], [4]]
 프로그램 [2] [[3], [4], [5]]
[3] [[4], [5], [6]]
◦ 08_3_2_RNN One-to-Many.ipynb . .
 x : 시퀀스 길이 1, 속성 1 개 . .
. .
 원 데이터는 (1,) [97] [[98], [99], [100]]
 모델 내에서 (3, 1) 로 변환
 y : 시퀀스 길이 3, 속성 1 개 TimeDistributed() : 각 스텝에서
loss 계산 및 오류 역전파
 모든 값을 100 으로 나누어 정규화
# 모델 만들기
inputs = keras.Input(shape=(1,))
x = layers.RepeatVector(3)(inputs) # (3, 1) 로 변형
x = layers.LSTM(16, return_sequences=True)(x)
# x = layers.LSTM(8, return_sequences=True)(x)
outputs = layers.TimeDistributed(layers.Dense(1, activation="sigmoid"))(x) # y 값 하나
하나는 숫자 (0~1 사이 )

model = keras.Model(inputs=inputs, outputs=outputs)


8/12
RNN 구조 유형
5. Many-to-Many 구조 (1)

Many-to-Many 구조 (1)
 입력 데이터의 시퀀스 길이와 출력 데이터의 시퀀스 길이
동일
 예 ) 단어 품사 예측
대명사 동사 관사 명사

RNN RNN RNN RNN

This is a ball

9/12
RNN 구조 유형
5. Many-to-Many 구조 (1)

Many-to-Many 구조 (1) 예제
 프로그램
◦ 08_3_3_RNN Many-to-Many.ipynb x y
 x : 시퀀스 길이 3, 속성 1 개 [[1], [2], [3]] [[2], [3], [4]]
[[2], [3], [4]] [[3], [4], [5]]
 y : 시퀀스 길이 3, 속성 1 개 [[3], [4], [5]] [[4], [5], [6]]
 모든 값을 100 으로 나누어 정규화 . .
. .
. .
[[97], [98], [99]] [[98], [99], [100]]

◦ TimeDistributed() 레이어 적용
inputs = keras.Input(shape=(3, 1))
x = layers.LSTM(16, return_sequences=True)(inputs)
outputs = layers.TimeDistributed(layers.Dense(1,
activation="sigmoid"))(x)
model = keras.Model(inputs=inputs, outputs=outputs)
10/12
RNN 구조 유형
6. Many-to-Many 구조 (2)

Many-to-Many 구조 (2)
 입력이 완료 된 후 출력 시작
◦ 입력 개수와 출력 개수가 다를 수도 있음
 예 ) 언어 번역

11/12
RNN 구조 유형
6. Many-to-Many 구조 (2)

Many-to-Many 구조 (2) 예제
 프로그램
◦ 08_3_4_RNN Many-to-Many2.ipynb x y
 x : 시퀀스 길이 3, 속성 1 개 [[1], [2], [3]] [[3], [4]]
 y : 시퀀스 길이 2, 속성 1 개 [[2], [3], [4]] [[4], [5]]
◦ 2 개의 LSTM 레이어로 구현 [[3], [4], [5]] [[5], [6]]
 LSTM 레이어 . .
 RepeatVector 레이어 . .
 LSTM 레이어 . .
[[97], [98], [99]] [[99], [100]]
 TimeDistributed 레이어

inputs = keras.Input(shape=(3, 1))


x = layers.LSTM(16, return_sequences=False)(inputs)
x = layers.RepeatVector(2)(x) # (2, 16) 로 변환
x = layers.LSTM(8, return_sequences=True)(x)
outputs = layers.TimeDistributed(layers.Dense(1,
activation="sigmoid"))(x)
model = keras.Model(inputs=inputs, outputs=outputs)
LSTM 상태 (Ct, Ht)  LSTM 초기값
연결 방법 : 코드 참조 12/12
RNN 구조 유형
연습 문제

apple 주가 예측 실험 (apple_stock2.csv)
 apple_stock2.csv 데이터는 1980 년부터 2021 년까지의
일별 주가 (Date, Open, High, Low, Close 등 ) 를 포함하고
있다 .
◦ 50 일 동안의 Open, High, Low, Close 주가를 기반으로 그 다음
날 3 일의 Open 주가를 예측하는 RNN 프로그램을 작성하라 .
◦ 하나의 예제의 경우 x, y 는 다음과 같이 표현된다 .
 x : [[1, 2, 3, 4], [3, 2, 3, 2], ..., [3, 4, 5, 2]]
 y : [[5], [7], [6]]]
 즉 , x 의 전체 shape 은 [?, 50, 4], y 는 [?, 3, 1] 이 됨
◦ MinMaxScaler 를 사용하여 0~1 로 스케일링한다 .
◦ 전체 데이터의 30% 를 검증 데이터로 사용한다 .
◦ epochs=100
◦ Many-to-Many 구조 (2) 를 사용하라 .
13/12
RNN 구조 유형

You might also like