์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ์ค์คํธ๋ฆฌ์
- ์ ๋ฝ
- ์๊ทน์ฌ
- special method
- ๊ตํํ์
- m1 anaconda ์ค์น
- Python
- Machine learning
- Andrew ng
- ๋์23์ด
- ์ ํํ๊ท
- fatigue fracture
- ์ด์ฐจ์ ์ง
- gradient descent
- Deeplearning
- ๋ฅ๋ฌ๋
- Linear Regression
- ๋ฏธ๋์์ ํด์ธ๊ตํ
- ํน๋ณ ๋ฉ์๋
- li-ion
- cost function
- electrochemical models
- anaconda ๊ฐ์ํ๊ฒฝ
- set add
- ๋ฏธ๋์์ ์ฅํ์
- ์ฒญ์ถ ํ์ดํ
- fluent python
- 2022๋
- set method
- ์ ๋ฝ ๊ตํํ์
- Today
- Total
Done is Better Than Perfect
[๋ฅ๋ฌ๋] 8. RNN ๋ณธ๋ฌธ
[ ๋ชฉ์ฐจ ]
1. ์์ฐจ๋ฐ์ดํฐ๋?
2. Recurrent Neural Network
3. Vanilla RNN (๊ฐ์ฅ ๊ฐ๋จํ ํํ์ RNN ๋ชจ๋ธ)
1. ์์ฐจ ๋ฐ์ดํฐ๋?
RNN(Recurrent Neural Network) : ์๊ณ์ด ๋ฐ์ดํฐ ๊ฐ์ ์์ฐจ ๋ฐ์ดํฐ(Sequential Data) ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ธ
์์ฐจ ๋ฐ์ดํฐ(Sequential Data) - ์์: ์๊ณ์ด ๋ฐ์ดํฐ, ์์ฐ์ด ๋ฐ์ดํฐ
- ์์(Order)๋ฅผ ๊ฐ์ง๊ณ ๋ํ๋๋ ๋ฐ์ดํฐ
- ๋ฐ์ดํฐ ๋ด ๊ฐ ๊ฐ์ฒด๊ฐ์ ์์๊ฐ ์ค์
- ์) ๋ ์ง์ ๋ฐ๋ฅธ ๊ธฐ์จ ๋ฐ์ดํฐ, ๋จ์ด๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์ฅ, DNA ์ผ๊ธฐ ์์ด, ์ํ๋ง๋ ์๋ฆฌ ์ ํธ ๋ฑ
- ์๊ณ์ด ๋ฐ์ดํฐ (Time-Series Data)
- ์ผ์ ํ ์๊ฐ ๊ฐ๊ฒฉ์ ๊ฐ์ง๊ณ ์ป์ด๋ธ ๋ฐ์ดํฐ
- ์) ์ฐ๋๋ณ ๋ํ๋ฏผ๊ตญ์ ํ๊ท ๊ธฐ์จ, ์๊ฐ๋ณ ์ฃผ์ ๊ฐ๊ฒฉ ๊ธฐ๋ก ๋ฑ
- ์์ฐ์ด ๋ฐ์ดํฐ (Natural Language)
- ์ธ๋ฅ๊ฐ ๋งํ๋ ์ธ์ด๋ฅผ ์๋ฏธ
- ์ฃผ๋ก ๋ฌธ์ฅ ๋ด์์ ๋จ์ด๊ฐ ๋ฑ์ฅํ๋ ์์์ ์ฃผ๋ชฉ
๋ฅ๋ฌ๋์ ํ์ฉํ ์์ฐจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์
1. ๊ฒฝํฅ์ฑ ํ์ : ์ฃผ๊ฐ ์์ธก, ๊ธฐ์จ ์์ธก ๋ฑ, ๋ค์ํ ์๊ณ์ด ํน์ง์ ๊ฐ์ง๋ ๋ฐ์ดํฐ์ ์ ์ฉ ๊ฐ๋ฅ
2. ์์ ์ฅ๋ฅด ๋ถ์ : ์ค๋์ค ํ์ผ์ ๋ณธ์ง์ ์ผ๋ก ์๊ณ์ด ๋ฐ์ดํฐ, ์ํ ํํ ๋ฑ์ ๋ถ์ํ์ฌ ์ค๋์ค ํ์ผ์ ์ฅ๋ฅด๋ฅผ ๋ถ์
3. ๊ฐ์๋์์ธก(Precipitation Forecasting) : ๊ตฌ๊ธ์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ธฐ์ ๊ณผ ๊ฒฐํฉํ์ฌ ์ฃผ๋์ ์ผ๋ก ์ฐ๊ตฌ (์: MetNet)
4. ์์ฑ ์ธ์ (Speech Recognition) : ์์ฑ์ ํฌํจ๋ ๋จ์ด๋ ์๋ฆฌ๋ฅผ ์ถ์ถ (์: Apple Siri, Google Assistant)
5. ๋ฒ์ญ๊ธฐ (Translator) : ๋ ์ธ์ด๊ฐ ๋ฌธ์ฅ ๋ฒ์ญ, ๋ฅ๋ฌ๋ ๋ฐ์ ์ดํ ๋ฒ์ญ์ ์์ฐ์ค๋ฌ์ ํฅ์ (์: ๊ตฌ๊ธ ๋ฒ์ญ, ๋ค์ด๋ฒ ํํ๊ณ ๋ฑ)
6. ์ฑ๋ด (chatbot) : ์ฌ์ฉ์์ ์ง๋ฌธ์ ์ฌ๋์ฒ๋ผ ์๋ตํ๋ ํ๋ก๊ทธ๋จ, ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ถ์ ํ ์ง๋ฌธ์ ์ ์ ํ ์๋ต ์์ฑ
2. Recurrent Neural Network
[ Fully connected Layer๊ฐ ์์ฐจ ๋ฐ์ดํฐ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ด์ ]
- FC Layer๋ ์ ๋ ฅ ๋ ธ๋ ๊ฐ์์ ์ถ๋ ฅ ๋ ธ๋ ๊ฐ์๊ฐ ์ ํด์ง
- ์์ฐจ๋ฐ์ดํฐ๋ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฃจ๋ ๊ฐ์ฒด ์๊ฐ ๋ค๋ฅผ ์ ์์ (์, ๋ฌธ์ฅ์ ๋ชจ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์์ ๋จ์ด๋ก ์ด๋ฃจ์ด์ง)
- ๋ํ, FC Layer๋ ์์ ๊ณ ๋ ค ๋ถ๊ฐ๋ฅ
RNN ( Recurrent Neural Network ) :
- ์์ฐจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฅ๋ฌ๋ ๋ชจ๋ธ
- RNN์ ๋ํ์ ์ธ ๊ตฌ์ฑ์์ -> Hidden State: ์ํ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ํต์ฌ ์ฅ์น
[ ์ ๋ ฅ ๋ฐ์ดํฐ (์์ฐจ์ ๋ฐ์ดํฐ) ๊ตฌ์กฐ ]
- $x_1,x_2,x_3, ... , x_n $๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ์ ๋์ด
- ๊ฐ $x_t$์ ์๋ฏธ
- ์๊ณ์ด ๋ฐ์ดํฐ : ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋๋ ์ง ๋ฐ์ดํฐ ๊ฐ์ฒด ํ๋
- ์์ฐ์ด ๋ฐ์ดํฐ : ๋ฌธ์ฅ ๋ด์ ๊ฐ ๋จ์ด
- ์๊ณ์ด ๋ฐ์ดํฐ์ ๋ฒกํฐ ๋ณํ
- ์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ฐ $x_t$๋ ๋ฒกํฐ ํํ
- ์๊ณ์ด ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฃจ๋ Feature ๊ฐ๋ค์ ์์๋ก ํ๋ ๋ฒกํฐ๋ก ๋ณํ
- ์์ฐ์ด ๋ฐ์ดํฐ์ ๋ฒกํฐ ๋ณํ
- ์๋ฒ ๋ฉ(Embedding): ๊ฐ ๋จ์ด๋ค์ ์ซ์๋ก ์ด๋ฃจ์ด์ง ๋ฒกํฐ๋ก ๋ณํ
- ๋ํ์ ์ธ ์๋ฒ ๋ฉ ๊ธฐ๋ฒ
- One-hot Encoding : ํ๋์ ์์๋ง 1์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ 0์ธ ํฌ์ ๋ฒกํฐ
- Word2Vec : ์ฃผ์ด์ง ๋จ์ด๋ค์ ๋ฒกํฐ๋ก ๋ณํํ๋ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ (๋จ์ด๊ฐ์ ์ฐ๊ด์ฑ ํํ)
3. Vanilla RNN
- ๊ฐ์ฅ ๊ฐ๋จํ ํํ์ RNN๋ชจ๋ธ
- ๋ด๋ถ์ ์ธ๊ฐ์ FC Layer๋ก ๊ตฌ์ฑ
- $W_{hh}$ : hidden state($h_{t-1}$)๋ฅผ ๋ณํํ๋ Layer์ ๊ฐ์ค์น ํ๋ ฌ
- $W_{xh}$ : ํ ์์ ์ ์ ๋ ฅ๊ฐ($x_t$)์ ๋ณํํ๋ Layer์ ๊ฐ์ค์น ํ๋ ฌ
- $W_{hy}$ : ํ ์์ ์ ์ถ๋ ฅ๊ฐ($y_t$)์ ๋ณํํ๋ Layer์ ๊ฐ์ค์น ํ๋ ฌ
[ Vanilla RNN์ ์ฐ์ฐ ๊ณผ์ - hidden state, output ]
- ํ์ฌ ์ ๋ ฅ๊ฐ($x_t$)์ ๋ํ ์๋ก์ด hidden state ($h_t$) ๊ณ์ฐ
- $ h_t = tanh(h_{t-1} W_{hh} + x_t W_{xh} $
- ํ์ฌ ์ ๋ ฅ๊ฐ($x_t$)์ ๋ํ ์๋ก์ด ์ถ๋ ฅ๊ฐ ($y_t$) ๊ณ์ฐ
- $ y_t = W_{hy}h_t $
- ์์ ๊ณ์ฐํ hidden state($h_t$) ์ด์ฉ
+) tanh๋ tangent hyperbolic ํจ์ : ํ์ฑํ ํจ์๋ก ์ฌ์ฉ (๋น์ ํ์ฑ ์ถ๊ฐ)
[ ์๊ฐ ์์ผ๋ก ๋ณด๋ Vanilla RNN์ ์ฐ์ฐ ๊ณผ์ ]
- ๋ชจ๋ธ์ ๋ค์ด์ค๋ ๊ฐ ์์ ์ ๋ฐ์ดํฐ $x_t$๋ง๋ค ์์ ์ค๋ช ํ ์ฐ์ฐ ๊ณผ์ ์ ์ํ
- ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ๋ฐ๋ณตํด์ ์ถ๋ ฅ๊ฐ($y_n$)๊ณผ hidden state($h_n$)๋ฅผ ๊ณ์ฐ
- ์ด์ ์์ ์ ์์ฑ๋ hidden state๋ฅผ ๋ค์ ์์ ์ ์ฌ์ฉ -> recurrent
- ์ฌ๊ธฐ์ RNN ๋ชจ๋ธ์ ๋์ผํ RNN ๋ชจ๋ธ - ์ ๋ ฅ ์์ ($x_n$)์ด ๋ค๋ฆ์ ํํํ๊ธฐ ์ํด ์์ผ๋ก ํผ์ณ์ ํํํ์
- Hidden state์ ์๋ฏธ
- ํน์ ์์ $t$๊น์ง ๋ค์ด์จ ์ ๋ ฅ๊ฐ๋ค์ ์๊ด ๊ด๊ณ๋ ๊ฒฝํฅ์ฑ ์ ๋ณด๋ฅผ ์์ถํด์ ์ ์ฅ
- ๋ชจ๋ธ์ด ๋ด๋ถ์ ์ผ๋ก ๊ณ์ ๊ฐ์ง๋ ๊ฐ์ด๋ฏ๋ก ์ผ์ข ์ ๋ฉ๋ชจ๋ฆฌ(Memory)๋ก ๋ณผ ์ ์์
- Parameter Sharing
- ๋ชจ๋ ์์ ์์ ๊ฐ์ RNN ๋ชจ๋ธ๊ณผ hidden state๋ฅผ ์ฌ์ฉ
- Hidden state์ ์ถ๋ ฅ๊ฐ ๊ณ์ฐ์ ์ํ FC Layer๋ฅผ ๋ชจ๋ ์์ ์ ์ ๋ ฅ๊ฐ์ด ์ฌ์ฌ์ฉ
- FC Layer ์ธ ๊ฐ๊ฐ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ์ ์ ๋ถ
[ Vanilla RNN์ ์ข ๋ฅ ]
์ฌ์ฉํ ์ ๋ ฅ๊ฐ๊ณผ ์ถ๋ ฅ๊ฐ์ ๊ตฌ์ฑ์ ๋ฐ๋ผ ์ฌ๋ฌ ์ข ๋ฅ์ RNN์ด ์กด์ฌ
- many-to-one : ํ ์์ ์๊ฐ ์ถ๋ ฅ๊ฐ๋ง ์ฌ์ฉ
- many-to-many : ์ฌ๋ฌ ์์ ์ ์
๋ ฅ๊ฐ๊ณผ ์ฌ๋ฌ ์์ ์ ์ถ๋ ฅ๊ฐ์ ์ฌ์ฉ
( ์ ๋ ฅ๊ฐ๊ณผ ์ถ๋ ฅ๊ฐ์ ์ฌ์ฉํ๋ ์์ ์ ๊ฐ์๋ ๊ฐ์ ์๋ ์๊ณ ๋ค๋ฅผ ์๋ ์์ )
- Encoder-Decoder : ์ ๋ ฅ๊ฐ๋ค์ ๋ฐ์ ํน์ hidden state๋ก ์ธ์ฝ๋ฉํ ํ, ์ด hidden state๋ก ์๋ก์ด ์ถ๋ ฅ๊ฐ ์์ฑํ๋ ๊ตฌ์กฐ
[ Vanilla RNN์ ๋ฌธ์ ์ ]
- RNN์ ์ถ๋ ฅ๊ฐ์ด ์๊ฐ ์์์ ๋ฐ๋ผ ์์ฑ
- ๊ฐ ์์ ์ ์ถ๋ ฅ๊ฐ๊ณผ ์ค์ ๊ฐ์ ๋น๊ตํ์ฌ ์์ค(Loss)๊ฐ ๊ณ์ฐ (์์ ๋ง๋ค ์์ค๊ฐ ๊ณ์ฐ)
- ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ด ์๊ฐ์ ๋ฐ๋ผ ์๋ → Back-propagation Through Time (BPTT)
- ์ ๋ ฅ๊ฐ์ ๊ธธ์ด๊ฐ ๋งค์ฐ ๊ธธ์ด์ง ๊ฒฝ์ฐ(์์ ์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ) -> ์ด๊ธฐ ์ ๋ ฅ๊ฐ๊ณผ ๋์ค ์ถ๋ ฅ๊ฐ ์ฌ์ด์ ์ ํ๋๋ ๊ธฐ์ธ๊ธฐ ๊ฐ์ด ๋งค์ฐ ์์์ง ๊ฐ๋ฅ์ฑ ๋์
- ๊ธฐ์ธ๊ธฐ ์์ค(Vanishing Gradient)๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ → ์ฅ๊ธฐ ์์กด์ฑ(Long-term Dependency)์ ๋ค๋ฃจ๊ธฐ๊ฐ ์ด๋ ค์
- RNN์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด LSTM, GRU ๋ฑ์ ๋ชจ๋ธ์ด ์ ์๋จ
[ Vanilla RNN ๋ถ๋ฅ ๋ชจ๋ธ ๊ตฌํ - 1๊ฐ์ SimpleRNN layer๋ก ๊ตฌํ ]
- Tensorflow์์๋ Vanilla RNN์ด SimpleRNN๋ก ๊ตฌํ๋์ด ์์
- Vanilla RNN์ผ๋ก IMDb ๋ฐ์ดํฐ ํ์ตํ๊ธฐ
- ์ฌ์ฉํ ๋ฐ์ดํฐ ์ : IMDb : ์ํ ์ ๋ณด, ์ฌ์ฉ์๋ค์ ๋ฆฌ๋ทฐ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ
- ์คํ ํฌ๋ ๋ํ์์ ์ฌ์ฉ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ณ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌ๋ทฐ๊ฐ ๊ธ์ ์ ์ธ์ง ๋ถ์ ์ ์ธ์ง ๋ถ์ํ์ฌ ํด๋์ค๊ฐ ๋๊ฐ์ธ ๋ฐ์ดํฐ ์ ์ ๊ตฌ์ฑํจ
- ๋ชจ๋ธ์์ ๋ง์ง๋ง dense layer์ ๋
ธ๋ ๊ฐ์๊ฐ 1๊ฐ๋ก ์ค์ -> ํ์ฑํ ํจ์๊ฐ sigmoid์ด๋ฏ๋ก 0~1 ๊ฐ์ด ๋์ด, ์ด๋ ํ๋ฅ ๋ก ํด์ ๊ฐ๋ฅํจ
import os
import tensorflow as tf
from tensorflow.keras import layers, Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences
def load_data(num_words, max_len): # imdb ๋ฐ์ดํฐ์
์ ๋ถ๋ฌ์ต๋๋ค.
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=num_words) # num_words: ํ์ฉํ ๋จ์ด์ ๊ฐ์
# ๋จ์ด๊ฐ ๊ฐ์ฅ ๋ง์ ๋ฌธ์ฅ์ ๋จ์ด ๊ฐ์๋ก ํต์ผ -> maxlen์ ์๋งํผ padding(0์ผ๋ก) ์ถ๊ฐ
X_train = pad_sequences(X_train, maxlen=max_len)
X_test = pad_sequences(X_test, maxlen=max_len)
return X_train, X_test, y_train, y_test
' Vanilla RNN ๋ชจ๋ธ ๊ตฌํ '
def build_rnn_model(num_words, embedding_len):
model = Sequential()
model.add(layers.Embedding(input_dim=num_words, output_dim=embedding_len))
model.add(layers.SimpleRNN(units=16)) # hidden state์ ํฌ๊ธฐ
model.add(layers.Dense(units=1, activation='sigmoid')) # ๋ถ๋ฅ
# ์ dense layer์ ๋
ธ๋ ๊ฐ์๊ฐ 1๊ฐ ์ธ์ง? => sigmoid์ด๋ฏ๋ก 0~1 ๊ฐ์ด ๋์ด, ์ด๋ ํ๋ฅ ๋ก ํด์ ๊ฐ๋ฅํจ
return model
def main(model=None, epochs=5):
# IMDb ๋ฐ์ดํฐ์
์์ ๊ฐ์ ธ์ฌ ๋จ์ด์ ๊ฐ์
num_words = 6000
# ๊ฐ ๋ฌธ์ฅ์ด ๊ฐ์ง ์ ์๋ ์ต๋ ๋จ์ด ๊ฐ์
max_len = 130
# ์๋ฒ ๋ฉ ๋ ๋ฒกํฐ์ ๊ธธ์ด
embedding_len = 100
X_train, X_test, y_train, y_test = load_data(num_words, max_len)
if model is None:
model = build_rnn_model(num_words, embedding_len)
# ๋ชจ๋ธ ์ต์ ํ
optimizer = Adam(learning_rate=0.001)
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
# ๋ชจ๋ธ ํ๋ จ
hist = model.fit(X_train, y_train, epochs=epochs,batch_size=100,validation_split=0.2,shuffle=True,verbose=2)
# ๋ชจ๋ธ ํ
์คํธ
test_loss, test_acc = model.evaluate(X_test, y_test, verbose=0)
print()
print("ํ
์คํธ Loss: {:.5f}, ํ
์คํธ ์ ํ๋: {:.3f}%".format(test_loss, test_acc * 100))
return optimizer, hist
if __name__=="__main__":
main()
[ ์ฝ๋ ์ํ ๊ฒฐ๊ณผ ]
ํ
์คํธ Loss: 0.49907, ํ
์คํธ ์ ํ๋: 81.984%
[ Vanilla RNN ์์ธก ๋ชจ๋ธ ๊ตฌํ - 1๊ฐ์ SimpleRNN layer๋ก ๊ตฌํ ]
- ํญ๊ณต ์น๊ฐ ์ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ์๋ณ๋ก ํญ๊ณต๊ธฐ๋ฅผ ์ด์ฉํ๋ ์น๊ฐ ์ ์์ธกํ๋ ๋ชจ๋ธ ์์ฑ
- ์ฌ์ฉํ ๋ฐ์ดํฐ ์ : 1949๋ 1์๋ถํฐ 1960๋ 12์๊น์ง ํญ๊ณต๊ธฐ ์ด์ฉ ์น๊ฐ ์๋ฅผ ์๋ณ๋ก ๊ธฐ๋กํ ๋ฐ์ดํฐ์ (์๊ณ์ด ๋ฐ์ดํฐ)
- ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ RNN ๊ธฐ๋ฐ ๋ชจ๋ธ์ ํ์ตํ ๋๋ window size๋ผ๋ ๊ฐ๋
์ฌ์ฉ
- window size : ๋ชจ๋ธ์ ํ๋ฒ ํ์ตํ ๋ ์ฌ์ฉํ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์๋ฏธ
- ๊ทธ๋ฆผ์ฒ๋ผ ์ด 10๊ฐ์ ๋ฐ์ดํฐ์์ 4๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ํ์ต์ ์ฌ์ฉํ๋ค๋ฉด window size๋ 4
import os
import tensorflow as tf
from tensorflow.keras import layers, Sequential
from tensorflow.keras.optimizers import Adam
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def load_data(window_size):
raw_data = pd.read_csv("./airline-passengers.csv")
raw_passengers = raw_data["Passengers"].to_numpy()
# ๋ฐ์ดํฐ์ ํ๊ท ๊ณผ ํ์คํธ์ฐจ ๊ฐ์ผ๋ก ์ ๊ทํ(ํ์คํ)
mean_passenger = raw_passengers.mean()
stdv_passenger = raw_passengers.std(ddof=0)
raw_passengers = (raw_passengers - mean_passenger) / stdv_passenger
data_stat = {"month": raw_data["Month"], "mean": mean_passenger, "stdv": stdv_passenger}
''' ์๊ณ์ด ๋ฐ์ดํฐ ์
๊ตฌ์ฑ '''
# window_size๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ์
๋ ฅ ๋ฐ์ดํฐ(X)๋ก ์ค์ ํ๊ณ
# window_size๋ณด๋ค ํ ์์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ ๋์(y)์ผ๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ์
๊ตฌ์ฑ
X, y = [], []
for i in range(len(raw_passengers) - window_size):
cur_passenger = raw_passengers[i:i + window_size]
target = raw_passengers[i + window_size]
X.append(list(cur_passenger))
y.append(target)
X = np.array(X)
y = np.array(y)
# ๊ฐ ์
๋ ฅ ๋ฐ์ดํฐ๋ sequence ๊ธธ์ด๊ฐ window_size์ด๊ณ , featuer ๊ฐ์๋ 1๊ฐ๊ฐ ๋๋๋ก ๋ง์ง๋ง์ ์๋ก์ด ์ฐจ์ ์ถ๊ฐ
# ์ฆ, (์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์, window_size) -> (์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์, window_size, 1)์ด ๋๋๋ก ๋ณํ
X = X[:, :, np.newaxis]
# ํ์ต ๋ฐ์ดํฐ 80%, ํ
์คํธ ๋ฐ์ดํฐ 20%
total_len = len(X)
train_len = int(total_len * 0.8)
X_train, y_train = X[:train_len], y[:train_len]
X_test, y_test = X[train_len:], y[train_len:]
return X_train, X_test, y_train, y_test, data_stat
''' Vanilla RNN ๋ชจ๋ธ ๊ตฌํ '''
def build_rnn_model(window_size):
model = Sequential()
model.add(layers.SimpleRNN(units=4,input_shape=(window_size, 1))) # ์์ฐ์ด ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ์๊ณ์ด ๋ฐ์ดํฐ์ด๋ฏ๋ก embedding layer ์์ -> ๋ฐ๋ผ์ input_shape์ ์๋ ค์ค์ผ ํ ํ์์์
model.add(layers.Dense(units=1)) # ํ์ฑํ ํจ์ ์ฌ์ฉ x ->๋ชจ๋ธ์ ์ถ๋ ฅ๊ฐ ์์ฒด๋ฅผ ํ๋ฅ ๋ก ์ฌ์ฉ
return model
def plot_result(X_true, y_true, y_pred, data_stat):
# ํ์คํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์๋ ๊ฐ์ผ๋ก ๋ณํ
y_true_orig = (y_true * data_stat["stdv"]) + data_stat["mean"]
y_pred_orig = (y_pred * data_stat["stdv"]) + data_stat["mean"]
# ํ
์คํธ ๋ฐ์ดํฐ์์ ์ฌ์ฉํ ๋ ์ง๋ค๋ง ๊ฐ์ ธ์ด
test_month = data_stat["month"][-len(y_true):]
# ๋ชจ๋ธ์ ์์ธก๊ฐ, ์ค์ ๊ฐ ๊ทธ๋ํ
fig = plt.figure(figsize=(8, 6))
ax = plt.gca()
ax.plot(y_true_orig, color="b", label="True")
ax.plot(y_pred_orig, color="r", label="Prediction")
ax.set_xticks(list(range(len(test_month))))
ax.set_xticklabels(test_month, rotation=45)
ax.set_title("RNN Result")
ax.legend(loc="upper left")
plt.savefig("airline_rnn.png")
elice_utils.send_image("airline_rnn.png")
def main(model=None, epochs=100):
tf.random.set_seed(2022)
window_size = 4
X_train, X_test, y_train, y_test, data_stat = load_data(window_size)
if model is None:
model = build_rnn_model(window_size)
# ๋ชจ๋ธ ์ต์ ํ
optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=optimizer, loss='MeanSquaredError')
# ๋ชจ๋ธ ํ์ต
hist = model.fit(X_train, y_train, batch_size=8,epochs=epochs,shuffle=True,verbose=2)
# ๋ชจ๋ธ ํ
์คํธ
test_loss = model.evaluate(X_test, y_test, verbose=0)
print()
print("ํ
์คํธ MSE: {:.5f}".format(test_loss))
print()
y_pred = model.predict(X_test)
plot_result(X_test, y_test, y_pred, data_stat)
return optimizer, hist
if __name__ == "__main__":
main()
[ Deep Vanilla RNN ๋ชจ๋ธ ๊ตฌํ - ์ฌ๋ฌ๊ฐ์ SimpleRNN layer๋ก ๊ตฌํ ]
- SimpleRNN ๋ํ Convolutional Layer ์ฒ๋ผ ํ๋์ Layer ๋ผ๊ณ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ธต์ผ๋ก ์์ ์ ์์
- ์ฌ๋ฌ SimpleRNN ์ธต์ผ๋ก ์ด๋ฃจ์ด์ง ๋ชจ๋ธ -> ์ฌ์ธต RNN(Deep RNN) ๋ชจ๋ธ
- ์คํ์์ SimpleRNN์ด ํ๋๋ก ์ด๋ฃจ์ด์ง ๋ชจ๋ธ๊ณผ ๋๊ฐ๋ก ์ด๋ฃจ์ด์ง ๋ชจ๋ธ์ ์ฑ๋ฅ ๋น๊ต
- ๋ฐ์ดํฐ์ : numpy๋ฅผ ์ด์ฉํ์ฌ 2๊ฐ์ sin ํจ์๋ฅผ ์กฐํฉํ ๊ฐ๋จํ ์๊ณ์ด ๋ฐ์ดํฐ
- Window Size๋ 50, ๋ชจ๋ธ์ ์์ธก ์ฑ๋ฅ์ Mean Squared Error(MSE) ์ ์๋ก ํ์ธ
- Deep Vanilla RNN์ many-to-many RNN ๊ตฌ์กฐ ์ฌ์ฉ -> ์์ฑ๋ N๊ฐ์ output์ด ๋ค์ RNN layer์ ์ ๋ ฅ์ผ๋ก ์ฐ์ด๊ธฐ ๋๋ฌธ
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow.keras import layers, Sequential
from tensorflow.keras.optimizers import Adam
import numpy as np
def load_data(num_data, window_size):
freq1, freq2, offsets1, offsets2 = np.random.rand(4, num_data, 1)
## freq1, freq2 : 2๊ฐ์ sinํจ์๊ฐ
## offset : sin ํจ์๊ฐ ์์๋ ๋๊ฐ์ง์ ์ง์ฐ ์๊ฐ
time = np.linspace(0, 1, window_size + 1)
series = 0.5 * np.sin((time - offsets1) * (freq1 * 10 + 10))
series += 0.1 * np.sin((time - offsets2) * (freq2 * 10 + 10)) # sin ํจ์๋ฅผ 2๊ฐ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ํฉ์ณ์ค
series += 0.1 * (np.random.rand(num_data, window_size + 1) - 0.5)
num_train = int(num_data * 0.8)
X_train, y_train = series[:num_train, :window_size], series[:num_train, -1]
X_test, y_test = series[num_train:, :window_size], series[num_train:, -1]
X_train = X_train[:, :, np.newaxis]
X_test = X_test[:, :, np.newaxis]
return X_train, X_test, y_train, y_test
''' 1๊ฐ์ SimpleRNN layer๋ฅผ ๊ฐ์ง๋ RNN ๋ชจ๋ธ '''
def build_rnn_model(window_size):
model = Sequential()
model.add(layers.SimpleRNN(units=20,input_shape=(window_size, 1)))
model.add(layers.Dense(units=1))
return model
''' 2๊ฐ์ SimpleRNN layer๋ฅผ ๊ฐ์ง๋ Deep RNN ๋ชจ๋ธ '''
def build_deep_rnn_model(window_size):
model = Sequential()
# return sequences : RNN์ ์ข
๋ฅ ์ค many-to-many๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ
# ์ฌ์ธต RNN ์ด๋ฏ๋ก many-to-many RNN ๋ชจ๋ธ ์์ฑ (์์ฑ๋ 20๊ฐ์ output์ด ๋ค์ simple RNN์ ์
๋ ฅ์ผ๋ก ์ฐ์)
model.add(layers.SimpleRNN(units=20,return_sequences=True,input_shape=(window_size, 1)))
model.add(layers.SimpleRNN(units=20))
model.add(layers.Dense(units=1))
return model
def run_model(model, X_train, X_test, y_train, y_test, epochs=20, name=None):
# ๋ชจ๋ธ ์ต์ ํ
optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=optimizer, loss='mse')
# ๋ชจ๋ธ ํ์ต
hist = model.fit(X_train, y_train,epochs=epochs,batch_size=256,shuffle=True,verbose=2)
# ๋ชจ๋ธ ํ
์คํธ
test_loss = model.evaluate(X_test, y_test, verbose=0)
print("[{}] ํ
์คํธ MSE: {:.5f}".format(name, test_loss))
print()
return optimizer, hist
def main():
tf.random.set_seed(2022)
np.random.seed(2022)
window_size = 50
X_train, X_test, y_train, y_test = load_data(10000, window_size)
rnn_model = build_rnn_model(window_size)
run_model(rnn_model, X_train, X_test, y_train, y_test, name="RNN")
deep_rnn_model = build_deep_rnn_model(window_size)
run_model(deep_rnn_model, X_train, X_test, y_train, y_test, name="Deep RNN")
if __name__ == "__main__":
main()
[ SimpleRNN์ ์ฌ์ฉํ์ฌ Encoder-Decoder ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ๋ชจ๋ธ ๊ตฌํ ]
- Encoder์์ ๋์ค๋ ์ถ๋ ฅ๊ฐ์ ์ฌ์ฉํ์ง ์๊ณ , Encoder์ hidden state๋ง ๊ฐ์ ธ์์ Decoder์ ์ด๊ธฐ hidden state๋ก ํ์ฉ
- __call__ ๋ฉ์๋ : ์ค์ ์ ๋ ฅ๊ฐ์ด ์ฃผ์ด์ก์ ๋ ๋ชจ๋ธ์ ์ฐ์ฐ์ ์ํํ๋ ํจ์
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras import layers, Sequential, Input
class EncoderDecoder(Model):
def __init__(self, hidden_dim, encoder_input_shape, decoder_input_shape, num_classes):
super(EncoderDecoder, self).__init__()
# SimpleRNN์ผ๋ก ์ด๋ฃจ์ด์ง Encoder
self.encoder = layers.SimpleRNN(units=hidden_dim,return_state=True,input_shape=encoder_input_shape)
# return state: hidden state๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ
# SimpleRNN์ผ๋ก ์ด๋ฃจ์ด์ง Decoder
self.decoder = layers.SimpleRNN(units=hidden_dim,return_sequences=True,input_shape=decoder_input_shape)
# decoder๋ input shape ์ง์ ํ ํ์ ์์
self.dense = layers.Dense(num_classes, activation="softmax")
def call(self, encoder_inputs, decoder_inputs):
# Encoder์ ์
๋ ฅ๊ฐ์ ๋ฃ์ด Decoder์ ์ด๊ธฐ state๋ก ์ฌ์ฉํ hidden state ๋ฐํ
encoder_outputs, encoder_state = self.encoder(encoder_inputs)
# Decoder์ ์
๋ ฅ๊ฐ์ ๋ฃ๊ณ , ์ด๊ธฐ state๋ Encoder์์ ์ป์ด๋ธ state(hidden state)๋ก ์ค์
decoder_outputs = self.decoder(decoder_inputs, initial_state = [encoder_state])
outputs = self.dense(decoder_outputs)
return outputs
def main():
# hidden state์ ํฌ๊ธฐ
hidden_dim = 20
# Encoder์ ๋ค์ด๊ฐ ๊ฐ ๋ฐ์ดํฐ์ ๋ชจ์
encoder_input_shape = (10, 1) # encoder์ ๋ค์ด๊ฐ ๊ฐ ์์ ์ ๋ฐ์ดํฐ - sequence ๊ธธ์ด :10, ๊ฐ ์์ ์ ๋ฐ์ดํฐ ๊ธธ์ด : 1
# Decoder์ ๋ค์ด๊ฐ ๊ฐ ๋ฐ์ดํฐ์ ๋ชจ์
decoder_input_shape = (30, 1)
# ๋ถ๋ฅํ ํด๋์ค ๊ฐ์
num_classes = 5
model = EncoderDecoder(hidden_dim, encoder_input_shape, decoder_input_shape, num_classes)
# ๋ชจ๋ธ์ ๋ฃ์ด์ค ๊ฐ์์ ๋ฐ์ดํฐ ์์ฑ
encoder_x, decoder_x = tf.random.uniform(shape=encoder_input_shape), tf.random.uniform(shape=decoder_input_shape)
encoder_x, decoder_x = tf.expand_dims(encoder_x, axis=0), tf.expand_dims(decoder_x, axis=0)
y = model(encoder_x, decoder_x)
# ๋ชจ๋ธ ์ ๋ณด ์ถ๋ ฅ
model.summary()
if __name__ == "__main__":
main()
[ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ ]
'๐ค AI > Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋] 9. LSTM, GRU (2) | 2024.07.10 |
---|---|
[๋ฅ๋ฌ๋] 7. CNN (2) | 2024.06.27 |
[๋ฅ๋ฌ๋] 6. ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ ๋ฌธ์ ์ pt.3 : ๊ณผ์ ํฉ (1) | 2024.06.22 |
[๋ฅ๋ฌ๋] 5. ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ ๋ฌธ์ ์ pt.2 : ๊ธฐ์ธ๊ธฐ ์์ค, ๊ฐ์ค์น ์ด๊ธฐํ ๋ฐฉ๋ฒ (3) | 2024.06.12 |
[๋ฅ๋ฌ๋] 4. ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ ๋ฌธ์ ์ pt.1 : ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.06.10 |