Professional Documents
Culture Documents
08 - 3 - RNN 문제 구조
08 - 3 - 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)
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 사이 )
Many-to-Many 구조 (1)
입력 데이터의 시퀀스 길이와 출력 데이터의 시퀀스 길이
동일
예 ) 단어 품사 예측
대명사 동사 관사 명사
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 레이어
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 구조 유형