Instructions to use OneclickAI/RNN_test_Model with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Keras
How to use OneclickAI/RNN_test_Model with Keras:
# !pip install -U keras tensorflow huggingface_hub # Keras needs TensorFlow installed to read "hf://" paths, so the tensorflow backend is selected here; # "jax" and "torch" also work for computation once TensorFlow is installed. import os os.environ["KERAS_BACKEND"] = "tensorflow" import keras model = keras.saving.load_model("hf://OneclickAI/RNN_test_Model") - Notebooks
- Google Colab
- Kaggle
์๋
ํ์ธ์ Oneclick AI ์
๋๋ค!!
์ค๋์, RNN(์ํ ์ ๊ฒฝ๋ง, Recurrent Neural Network) ๋ชจ๋ธ์ ๋ํด์ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค.
๋ฅ๋ฌ๋์ด ๋ฌธ์ฅ, ์์ฑ, ์ฃผ๊ฐ ์์ธก๊ณผ ๊ฐ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ(Sequential Data)๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ ๊ฒ์ ์ ์ ์ผ๋ก RNN ๋๋ถ์
๋๋ค.
๋จ์ํ ์ ๊ฒฝ๋ง์ด '์์'๋ผ๋ ๊ฐ๋
์ ์ดํดํ์ง ๋ชปํ๋ ๋ฐ๋ฉด,
RNN์ ๋ง์น ์ฌ๋์ฒ๋ผ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ , ๋ค์์ ์์ธกํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
์ค๋์ ์ด RNN์ด๋ผ๋ ์ ๊ฒฝ๋ง์ด ์ด๋ป๊ฒ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๋ฉฐ ์๋ํ๋์ง,
๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ๋ฌธ์ฅ์ ์จ๊ฒจ์ง ๋ฌธ๋งฅ๊ณผ ์๋ฏธ๋ฅผ ํ์
ํ ์ ์๋์ง ์์๋ด
์๋ค.
๋ชฉ์ฐจ
- RNN ํต์ฌ ์๋ฆฌ ํ์
ํ๊ธฐ
- ์ ์์ฐจ ๋ฐ์ดํฐ์ RNN์ ์ฌ์ฉํด์ผ๋ง ํ ๊น?
- RNN์ ์ฌ์ฅ : ์ํ ๊ตฌ์กฐ์ ์๋ ์ํ์ ์ญํ
- RNN์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ
- RNN์ ์ฃผ์ ๊ตฌ์ฑ ์์ ์์ธ ๋ถ์
- ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
- Keras๋ก ๊ตฌํํ RNN ๋ชจ๋ธ ์ํคํ ์ฒ
- model.summary()๋ก ๊ตฌ์กฐ ํ์ธํ๊ธฐ
- ์ง์ RNN ๊ตฌํํด ๋ณด๊ธฐ
- 1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ
- 2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ
- 3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
- 4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ
- 5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ ์คํธํ๊ธฐ
- ๋๋ง์ RNN ๋ชจ๋ธ ์
๊ทธ๋ ์ด๋ํ๊ธฐ
- ๊ธฐ์ด ์ฒด๋ ฅ ํ๋ จ : ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
- RNN์ ์น๋ช ์ ์ฝ์ : ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์
- ๊ธฐ์ต๋ ฅ ๊ฐํ : LSTM๊ณผ GRU์ ๋ฑ์ฅ
- ๊ณผ๊ฑฐ์ ๋ฏธ๋๋ฅผ ๋์์ : ์๋ฐฉํฅ RNN
- ๊ฒฐ๋ก
1. RNN ํต์ฌ์๋ฆฌ ํ์ ํ๊ธฐ
๊ฐ์ฅ ๋จผ์ , RNN์ด ์ ์์ฐจ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ดํดํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ธ์ง ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ์์ฐจ ๋ฐ์ดํฐ์ RNN์ ์ฌ์ฉํ ๊น?? with MLP, CNN์ ํ๊ณ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๊ฒฝ๋ง์ธ MLP(๋ค์ธต ํผ์
ํธ๋ก )์ "๋๋ ํ๊ต์ ๊ฐ๋ค"๋ผ๋ ๋ฌธ์ฅ์ ์
๋ ฅํ๋ค๊ณ ์์ํด ๋ด
์๋ค.
MLP๋ ๊ฐ ๋จ์ด๋ฅผ ๋
๋ฆฝ์ ์ธ ํน์ง์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์, "ํ๊ต์ ๋๋ ๊ฐ๋ค"๋ผ๋ ๋ฌธ์ฅ๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ฐ์๋ค์
๋๋ค.
๋จ์ด์ '์์'๊ฐ ๊ฐ์ง ์ค์ํ ์๋ฏธ, ์ฆ ๋ฌธ๋งฅ์ ์์ ํ ์์ด๋ฒ๋ฆฌ๋ ๊ฒ์
๋๋ค.
์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ CNN ์ญ์ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
CNN์ ๊ณต๊ฐ์ ์ธ ํน์ง(ํฝ์
์ฃผ๋ณ ๊ด๊ณ)์ ์ถ์ถํ๋ ๋ฐ๋ ๋ฐ์ด๋์ง๋ง, ์๊ฐ์ ์ธ ์์๋ ํ๋ฆ์ ํ์
ํ๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค.
๋ฐ๋ฉด, RNN์ ์ค๊ณ ์์ฒด๊ฐ '์์'๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
์ด์ ๋จ๊ณ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋จ๊ณ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฌ์ฉํ๋ '์ํ' ๊ตฌ์กฐ๋ฅผ ํตํด, ๋ง์น ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ฅ์ ์์์๋ถํฐ ์ฐจ๋ก๋ก ์ฝ์ผ๋ฉฐ ๋ด์ฉ์ ๋จธ๋ฆฟ์์ ์ถ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
RNN์ ์ฌ์ฅ : ์ํ ๊ตฌ์กฐ์ ์๋ ์ํ์ ์ญํ
RNN์ ํต์ฌ ์์ด๋์ด๋ ๋ฐ๋ก ์ํ ๊ตฌ์กฐ(Recurrent Structure)์ ์๋ ์ํ(Hidden State) ์
๋๋ค.
์ํ ๊ตฌ์กฐ(Recurrent Structure)
์ ๊ฒฝ๋ง ๋ด๋ถ์ '๋ฃจํ'๊ฐ ์กด์ฌํ์ฌ, ์ ๋ณด๊ฐ ๊ณ์ํด์ ์ํํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค.
๊ฐ ํ์์คํ $t$์์ ๋ชจ๋ธ์ ์ ๋ ฅ $x_t$์ ์ด์ ํ์์คํ ์ ์ ๋ณด ์์ฝ๋ณธ์ธ $h_{t-1}$์ ํจ๊ป ๋ฐ์ ์ฒ๋ฆฌํฉ๋๋ค.์๋ ์ํ(Hidden State, $h_t$)
์๋ ์ํ๋ '๋ฉ๋ชจ๋ฆฌ' ๋๋ '๋ฌธ๋งฅ ๋ฒกํฐ'๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, RNN์ ๋ชจ๋ ๊ฒ์ ๋ด๊ณ ์์ต๋๋ค.
ํน์ ํ์์คํ t์์์ ์๋ ์ํ $h_t$๋ ๋ค์๊ณผ ๊ฐ์ ์์์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
$h_t=tanh(W_hhh_tโ1+W_xhx_t+b_h)$์ฌ๊ธฐ์ $W_hh$, $W_{xh}$๋ ํ์ต์ ํตํด ์ต์ ํ๋๋ ๊ฐ์ค์น ํ๋ ฌ์ด๋ฉฐ, $b_h$๋ ํธํฅ์ ๋๋ค.
์ค์ํ ์ ์ ๋ชจ๋ ํ์์คํ ์์ ๋์ผํ ๊ฐ์ค์น($W$)์ ํธํฅ($b$)์ด ๊ณต์ ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ ๋ชจ๋ธ์ด ์๊ฐ๊ณผ ๊ด๊ณ์์ด ์ผ๊ด๋ ํจํด์ ํ์ตํ๊ฒ ํ๋ฉฐ, ํ๋ผ๋ฏธํฐ ์๋ฅผ ํฌ๊ฒ ์ค์ฌ์ค๋๋ค.
tanh์ ๊ฐ์ ํ์ฑํ ํจ์๋ ๊ณ์ฐ๋ ๊ฐ์ ํน์ ๋ฒ์(-1์์ 1 ์ฌ์ด)๋ก ์์ถํ๋ ์ญํ ์ ํฉ๋๋ค.
RNN์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์๊ฐ์ ๋ฐ๋ผ ๋คํธ์ํฌ๋ฅผ ๊ธธ๊ฒ ํผ์ณ์ ํํํ๋ฉด, ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
์๊ฐ ํ๋ฆ โโโโถ
์
๋ ฅ ์ํ์ค: xโ xโ xโ ... xโ
โ โ โ โ
โโโโโโ โโโโโโ โโโโโโ ... โโโโโโ
hโ โโโโถ โRNN โโถโRNN โโถโRNN โ โถ ... โถโRNN โ
โโโโโโ โโโโโโ โโโโโโ โโโโโโ
โ โ โ โ
โผ โผ โผ โผ
hโ hโ hโ hโ
RNN์ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ ์
์ ๋งค ์์ ๋ง๋ค ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ ์
๋๋ค.
ํผ์ณ์ ๋ณด๋ฉด, ์ ๊ทธ๋ฆผ์ฒ๋ผ ํ๋์ RNN์
์ด ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฒ ๋ณต์ ๋ ๊ฒ ์ฒ๋ผ ๋ณด์
๋๋ค.
์์๋๋ก ๋ณด์๋ฉด,
- ๊ฐ ์์ ์ $X_t$๊ฐ RNN ์ ์ ๋ค์ด๊ฐ๊ณ ,
- ์ด์ ์์ ์ ์์ ์ํ์ $h_(t^-1)$๋ ํจ๊ป ๋ค์ด๊ฐ์,
- ์๋ก์ด ์๋์ํ $h_t$๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ์ด $h_t$๋ ๋ค์ ์์ ์ผ๋ก ์ ๋ฌ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ญํ ์ ํฉ๋๋ค.
์ ๊ทธ๋ฆผ ์ ์ฌ๋ฌ ์ ์ ๊ฐ์ RNN ์ ์ ์๊ฐ์ ๋ฐ๋ผ ๋ณต์ ํ ๊ฒ์ด๊ณ , ๋ชจ๋ ์ ์ ๊ฐ์ค์น๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๊ท์น์ผ๋ก ๊ณ์ฐ์ด ์ด๋ฃจ์ด ์ง๋๋ค.
๋ณด์ถฉ์ค๋ช
ํ์๋ฉด,๋๋ ํ๊ต์ ๊ฐ๋ค
๋ฅผ ์
๋ ฅํ๋ฉด,
$X_1$์ด ๋๋, $X_2$๊ฐ ํ๊ต์, $X_3$ ๊ฐ ๊ฐ๋ค๊ฐ ๋๋ฉด์ ์๊ฐ์ ๋ฐ๋ฅธ ์ฐ์ฐ์ด ์ด๋ฃจ์ด ์ง๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
2. ์ํคํ ์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
์ด์ ์ด๋ก ์ ๋ฐํ์ผ๋ก, TensorFlow Keras ๋ฅผ ํตํด ์ง์ RNN์ ๊ตฌํํด ๋ด
์๋ค.
Keras๋ก ๊ตฌํํ RNN ๋ชจ๋ธ ์ํคํ
์ฒ ์ฌ์ธต ๋ถ์๋ค์์ IMDB ์ํ ๋ฆฌ๋ทฐ ๊ฐ์ฑ ๋ถ์์ ์ํ ๊ฐ๋จํ RNN ๋ชจ๋ธ์
๋๋ค.
import tensorflow as tf
from tensorflow import keras
# ๋ชจ๋ธ ์ํคํ
์ฒ ์ ์
model = keras.Sequential([
# 1. ๋จ์ด ์๋ฒ ๋ฉ ์ธต
# input_dim: ์ ์ฒด ๋จ์ด ์งํฉ์ ํฌ๊ธฐ (๊ฐ์ฅ ๋น๋ฒํ 1๋ง๊ฐ ๋จ์ด)
# output_dim: ๊ฐ ๋จ์ด๋ฅผ ํํํ ๋ฒกํฐ์ ์ฐจ์ (32์ฐจ์)
keras.layers.Embedding(input_dim=10000, output_dim=32),
# 2. RNN ์ธต
# units: ์๋ ์ํ ๋ฒกํฐ์ ์ฐจ์ (32์ฐจ์)
keras.layers.SimpleRNN(32),
# 3. ์ต์ข
๋ถ๋ฅ๊ธฐ(Classifier)
# units: ์ถ๋ ฅ ๋ด๋ฐ์ ์ (๊ธ์ /๋ถ์ 1๊ฐ)
# activation: ์ถ๋ ฅ ๊ฐ์ 0~1 ์ฌ์ด ํ๋ฅ ๋ก ๋ณํ (์ด์ง ๋ถ๋ฅ)
keras.layers.Dense(1, activation="sigmoid"),
])
# ๋ชจ๋ธ ๊ตฌ์กฐ ์์ฝ ์ถ๋ ฅ
model.summary()
๋ ์ด์ด๋ฅผ ์์ธํ ๋ค์ด๋ค ๋ด ์๋ค.
- ์๋ฒ ๋ฉ ์ธต(Embedding)
keras.layers.Embedding(input_dim=10000, output_dim=32)
์ปดํจํฐ๋ '์ํ', '์ฌ๋ฏธ' ๊ฐ์ ๋จ์ด๋ฅผ ์ง์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
Embedding ์ธต์ ๊ฐ ๋จ์ด์ ๋ถ์ฌ๋ ๊ณ ์ ํ ์ ์ ์ธ๋ฑ์ค๋ฅผ output_dim ์ฐจ์์ ์๋ฏธ๋ก ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
์ด ๊ณผ์ ์์ '์ฌํ'๊ณผ '๋น๊ทน' ๊ฐ์ ๋จ์ด๋ค์ ๋ฒกํฐ ๊ณต๊ฐ์์์ ๊ฐ๊น์ด ์์น์, 'ํ๋ณต'๊ณผ๋ ๋จผ ์์น์ ํํ๋๋๋ก ํ์ต๋ฉ๋๋ค.
- ์ํ ๊ณ์ธต(SimpleRNN)
keras.layers.SimpleRNN(32),
์ด ์ธต์ด ์ํ ์ ๊ฒฝ๋ง์ ๋ณธ์ฒด์
๋๋ค.
์
๋ ฅ๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ฒกํฐ ์ํ์ค๋ฅผ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉฐ ์๋ ์ํ๋ฅผ ๊ณ์ํด์ ์
๋ฐ์ดํธํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ง๋ง ๋จ์ด๊น์ง ์ฒ๋ฆฌํ ํ์ ์ต์ข
์๋ ์ํ๋ง์ ๋ค์ ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค.
์ด ์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ ์ ์ฒด ๋ฌธ์ฅ์ ๋ฌธ๋งฅ์ ์์ถํ ๊ฒฐ๊ณผ๋ฌผ์
๋๋ค.
- ์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense)
keras.layers.Dense(1, activation="sigmoid")
์ต์ข ์๋ ์ํ ๋ฒกํฐ๋ฅผ ๋ฐ์, ๋ฆฌ๋ทฐ๊ฐ ๊ธ์ (1์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ๋ถ์ (0์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ์ต์ข ํ๋จ์ ๋ด๋ฆฝ๋๋ค. model.summary()๋ก ํ๋ผ๋ฏธํฐ ์ ๊ณ์ฐ ์๋ฆฌ ์ดํดํ๊ธฐ์ ์ฝ๋์์ model.summary()๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, None, 32) 320000
simple_rnn (SimpleRNN) (None, 32) 2080
dense (Dense) (None, 1) 33
=================================================================
Total params: 322,113
Trainable params: 322,113
Non-trainable params: 0
_________________________________________________________________
๊ฐ ์ธต์ ํ๋ผ๋ฏธํฐ ์๋ ์ด๋ป๊ฒ ๊ณ์ฐ๋๋์ง ์์๋ณด์๋ฉด,
- Embedding: input_dim * output_dim = 10,000 * 32 = 320,000 ๊ฐ. (1๋ง ๊ฐ ๋จ์ด ๊ฐ๊ฐ์ ๋ํ 32์ฐจ์ ๋ฒกํฐ)
- SimpleRNN:
- ์ ๋ ฅ ๊ฐ์ค์น(W_xh): input_shape * units = 32 * 32 = 1024
- ์๋ ์ํ ๊ฐ์ค์น(W_hh): units * units = 32 * 32 = 1024
- ํธํฅ(b_h): units = 32
- ์ดํฉ: 1024 + 1024 + 32 = 2,080 ๊ฐ.
- Dense: input_shape * units + bias = 32 * 1 + 1 = 33 ๊ฐ.
์ด์ฒ๋ผ summary๋ฅผ ํตํด ๋ชจ๋ธ์ ๊ตฌ์กฐ๋ฟ๋ง ์๋๋ผ, ๊ฐ ์ธต์ด ์ผ๋ง๋ ๋ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ตํด์ผ ํ๋์ง ์ ํํ ํ์ ํ ์ ์์ต๋๋ค.
3. ์ง์ RNN ๊ตฌํํด ๋ณด๊ธฐ (์ค์ ์์ )
์ด์ ์ ์ฒด ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๋ฉฐ ์ง์ ๋ชจ๋ธ์ ํ์ต์์ผ ๋ณด๊ฒ ์ต๋๋ค.
1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ (ํจ๋ฉ์ ์ค์์ฑ)
RNN์ ๊ณ ์ ๋ ๊ธธ์ด์ ์ํ์ค๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค.
ํ์ง๋ง ์ํ ๋ฆฌ๋ทฐ๋ ๊ธธ์ด๊ฐ ์ ๊ฐ๊ฐ์ด๋ฏ๋ก, **ํจ๋ฉ(Padding)**์ ํตํด ๋ชจ๋ ๋ฆฌ๋ทฐ์ ๊ธธ์ด๋ฅผ ๋์ผํ๊ฒ ๋ง์ถฐ์ค์ผ ํฉ๋๋ค.
import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras import layers
# ๊ฐ์ฅ ๋น๋๊ฐ ๋์ 1๋ง๊ฐ ๋จ์ด๋ง ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์
๋ก๋
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=10000)
print(f"ํจ๋ฉ ์ ์ฒซ ๋ฒ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")
# ๋ชจ๋ ์ํ์ค์ ๊ธธ์ด๋ฅผ 256์ผ๋ก ํต์ผ
# maxlen๋ณด๋ค ๊ธธ๋ฉด ์๋ผ๋ด๊ณ , ์งง์ผ๋ฉด ์๋ถ๋ถ์ 0์ผ๋ก ์ฑ์ (pre-padding)
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=256)
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=256)
print(f"ํจ๋ฉ ํ ์ฒซ ๋ฒ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")
2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ
๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
model.compile(
# ์์ค ํจ์: ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ .
# ์ด์ง ๋ถ๋ฅ(0 ๋๋ 1) ๋ฌธ์ ์ด๋ฏ๋ก binary_crossentropy๊ฐ ๊ฐ์ฅ ์ ํฉ.
loss="binary_crossentropy",
# ์ตํฐ๋ง์ด์ : ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ์๊ณ ๋ฆฌ์ฆ.
# Adam์ ํ์ฌ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ์ตํฐ๋ง์ด์ ์ค ํ๋.
optimizer="adam",
# ํ๊ฐ์งํ: ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ. ์ ํ๋๋ฅผ ์ฌ์ฉ.
metrics=["accuracy"]
)
3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ (๋ฐฐ์น, ์ํฌํฌ, ๊ทธ๋ฆฌ๊ณ ๊ณผ์ ํฉ)
model.fit() ํจ์๋ก ์ค์ ํ์ต์ ์์ํฉ๋๋ค.
batch_size: ํ ๋ฒ์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ์ํ์ ์. ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ํ์ต ์๋์ ์ํฅ์ ์ค๋๋ค.
epochs: ์ ์ฒด ๋ฐ์ดํฐ์
์ ๋ช ๋ฒ ๋ฐ๋ณตํ์ฌ ํ์ตํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
batch_size = 128
epochs = 10
# ๋ชจ๋ธ ํ์ต ์คํ
# validation_data๋ฅผ ์ง์ ํ์ฌ ๋งค ์ํฌํฌ๋ง๋ค ํ
์คํธ ๋ฐ์ดํฐ๋ก ์ฑ๋ฅ์ ๊ฒ์ฆ
history = model.fit(
x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test)
)
# ํ์ต ์๋ฃ ํ ์ต์ข
์ฑ๋ฅ ํ๊ฐ
score = model.evaluate(x_test, y_test, verbose=0)
print(f"\nTest loss: {score[0]:.4f}")
print(f"Test accuracy: {score[1]:.4f}")
ํ์ต ๊ณผ์ ์ ์ง์ผ๋ณผ ๋, ํ๋ จ ๋ฐ์ดํฐ์ ์ ํ๋(accuracy)๋ ๊ณ์ ์ค๋ฅด๋๋ฐ ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ ํ๋(val_accuracy)๊ฐ ์ด๋ ์๊ฐ๋ถํฐ ์ ์ฒด๋๊ฑฐ๋ ๋จ์ด์ง๋ค๋ฉด, ๋ชจ๋ธ์ด ํ๋ จ ๋ฐ์ดํฐ์๋ง ๊ณผํ๊ฒ ์ ์ํ๋ ๊ณผ์ ํฉ(Overfitting)์ด ๋ฐ์ํ๊ณ ์๋ค๋ ์ ํธ์
๋๋ค.
์ด๋ด ๋๋, ๋๋กญ์์์ ๋น์จ์ ๋์ด๊ฑฐ๋ ํ์ต์จ์ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ
ํ์ต์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ชจ๋ธ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๊ณ ํ์ํ ๋๋ง๋ค ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์
๋๋ค.
# ๋ชจ๋ธ์ ๊ตฌ์กฐ, ๊ฐ์ค์น, ํ์ต ์ค์ ์ ๋ชจ๋ '.keras' ํ์ผ ํ๋์ ์ ์ฅ
model.save("my_rnn_model_imdb.keras")
# ์ ์ฅ๋ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
loaded_model = keras.models.load_model("my_rnn_model_imdb.keras")
5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ
์คํธํ๊ธฐ (์ค์ ์์ธก)
์ค์ ๋ฌธ์ฅ์ ์์ธกํ๋ ค๋ฉด, ํ๋ จ ๋ฐ์ดํฐ์ ๋์ผํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
# IMDB ๋ฐ์ดํฐ์
์ ๋จ์ด-์ธ๋ฑ์ค ์ฌ์ ๋ก๋
word_index = keras.datasets.imdb.get_word_index()
# ์๋ก์ด ๋ฆฌ๋ทฐ ๋ฌธ์ฅ
review = "This movie was fantastic and wonderful"
# 1. ์๋ฌธ์ ๋ณํ ๋ฐ ๋จ์ด ๋ถ๋ฆฌ -> 2. ๋จ์ด ์ธ๋ฑ์ค๋ก ๋ณํ
tokens = [word_index.get(word, 2) for word in review.lower().split()]
# 3. ํจ๋ฉ ์ฒ๋ฆฌ
padded_tokens = keras.preprocessing.sequence.pad_sequences([tokens], maxlen=256)
# 4. ์์ธก
prediction = loaded_model.predict(padded_tokens)
print(f"๋ฆฌ๋ทฐ: '{review}'")
print(f"๊ธ์ ํ๋ฅ : {prediction[0][0] * 100:.2f}%")
- ๋๋ง์ RNN ๋ชจ๋ธ ์
๊ทธ๋ ์ด๋ํ๊ธฐ
๊ธฐ๋ณธ RNN๋ ์ข์ง๋ง, ๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ํ๊ณ๋ฅผ ๊ทน๋ณตํด์ผ ํฉ๋๋ค.
RNN์ ์น๋ช
์ ์ฝ์ : ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ (Vanishing Gradients)
"๋๋ ํ๋์ค์์ ํ์ด๋ ์๋๋ค. ... (์ค๋ต) ... ๊ทธ๋์ ๋๋ ___๋ฅผ ์ ์ฐฝํ๊ฒ ๊ตฌ์ฌํ๋ค."
๋น์นธ์ ๋ค์ด๊ฐ ๋ง์ 'ํ๋์ค์ด'์
๋๋ค.
์ฌ๋์ ๋ฌธ์ฅ ๋งจ ์์ 'ํ๋์ค'๋ผ๋ ๋จ์ด๋ฅผ ๊ธฐ์ตํ์ฌ ์ฝ๊ฒ ๋ต์ ์ฐพ์ต๋๋ค.
ํ์ง๋ง ๊ธฐ๋ณธ RNN์ ์ํ์ค๊ฐ ๊ธธ์ด์ง์๋ก, ์ญ์ ํ ๊ณผ์ ์์ ๊ทธ๋๋์ธํธ(๊ธฐ์ธ๊ธฐ)๊ฐ ๊ณ์ ๊ณฑํด์ง๋ฉด์ 0์ ๊ฐ๊น์์ ธ ์ฌ๋ผ์ง๋ ๊ทธ๋๋์ธํธ ์์ค(Vanishing Gradient) ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ก ์ธํด ๋ฌธ์ฅ ์๋ถ๋ถ์ ์ค์ํ ์ ๋ณด๋ฅผ ํ์ตํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
์ค์ ๋ก, ์ง๊ธ ํ๊น
ํ์ด์ค์ ์ฌ๋ผ๊ฐ์ ์๋ RNN ๋ชจ๋ธ์ ์ฌ์ฉํด ๋ณด๋ฉด,
ํธํฅ๋์ด ํ๊ฐ์ง ๋ผ๋ฒจ๋ง ๊ณ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ด ๋ชจ์ต์ด RNN์ ํ๊ณ๋ฅผ ๋ช
ํํ๊ฒ ๋ณด์ฌ์ฃผ๋๋ฐ์,
๋ฐ๋ก ์์ ์ค๋ช
ํ ์ฅ๊ธฐ์์กด์ฑ, ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ์
๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๊ตฌ์กฐ๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
๊ธฐ์ต๋ ฅ ๊ฐํ : LSTM๊ณผ GRU์ ๋ฑ์ฅ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **LSTM(Long Short-Term Memory)**๊ณผ **GRU(Gated Recurrent Unit)**๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
์ด๋ค์ RNN ๋ด๋ถ์ **๊ฒ์ดํธ(Gate)**๋ผ๋ ์ ๊ตํ ์ฅ์น๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋ณด์ ํ๋ฆ์ ์ ์ดํฉ๋๋ค.
- LSTM: '์
์ํ(Cell State)'๋ผ๋ ๋ณ๋์ ๊ธฐ์ต ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ๋๊ณ , ๋ง๊ฐ ๊ฒ์ดํธ(Forget Gate), ์
๋ ฅ ๊ฒ์ดํธ(Input Gate), ์ถ๋ ฅ ๊ฒ์ดํธ(Output Gate) 3๊ฐ์ ๊ฒ์ดํธ๋ฅผ ํตํด ์ด๋ค ์ ๋ณด๋ฅผ ๋ฒ๋ฆฌ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์๋ก ๊ธฐ์ตํ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ง ํ์ตํฉ๋๋ค.
์ฅ๊ธฐ ๊ธฐ์ต์ ๋งค์ฐ ํจ๊ณผ์ ์ ๋๋ค. - GRU: LSTM์ ๋ ๋จ์ํํ ๋ชจ๋ธ๋ก, **๋ฆฌ์
๊ฒ์ดํธ(Reset Gate)**์ ์
๋ฐ์ดํธ ๊ฒ์ดํธ(Update Gate) 2๊ฐ์ ๊ฒ์ดํธ๋ง ์ฌ์ฉํฉ๋๋ค.
ํ๋ผ๋ฏธํฐ ์๊ฐ ์ ์ด ๊ณ์ฐ ํจ์จ์ฑ์ด ๋๊ณ , ๋ง์ ๊ฒฝ์ฐ LSTM๊ณผ ๋น์ทํ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
# LSTM์ 2๊ฐ ์ธต์ผ๋ก ์์ ๋ชจ๋ธ
model_lstm = keras.Sequential([
layers.Embedding(input_dim=10000, output_dim=64),
# return_sequences=True: ๋ค์ LSTM ์ธต์ผ๋ก ์ ์ฒด ์ํ์ค๋ฅผ ์ ๋ฌ
layers.LSTM(64, return_sequences=True),
layers.LSTM(32),
layers.Dense(1, activation='sigmoid')
])
๊ณผ๊ฑฐ์ ๋ฏธ๋๋ฅผ ๋์์ : ์๋ฐฉํฅ RNN (Bidirectional RNN)
"์ค๋ ์๋ก ์จ ___ ์ ์๋์ ์ ๋ง ๋ฉ์ง๋ค."
๋น์นธ์ ๋ค์ด๊ฐ '์์ด'๋ผ๋ ๋จ์ด๋ ๋ท๋ถ๋ถ์ '์ ์๋'์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ด์ผ ๋ ์ ํํ ์ ์ถํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ ๋ฌธ๋งฅ์ ์๋ฐฉํฅ๋ฟ๋ง ์๋๋ผ ์ญ๋ฐฉํฅ์ ์ ๋ณด๋ ์ค์ํฉ๋๋ค.
**์๋ฐฉํฅ RNN(Bidirectional RNN)**์ ์ํ์ค๋ฅผ ์ ๋ฐฉํฅ์ผ๋ก ํ๋ฒ, ์ญ๋ฐฉํฅ์ผ๋ก ํ๋ฒ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ ํ, ๋ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ต์ข
์ถ๋ ฅ์ ๋ง๋ญ๋๋ค.
์ด๋ฅผ ํตํด ๋ฌธ๋งฅ์ ํจ์ฌ ๋ ํ๋ถํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
model_bidirectional = keras.Sequential([
layers.Embedding(input_dim=10000, output_dim=64),
# LSTM ๋ ์ด์ด๋ฅผ Bidirectional ๋ํผ๋ก ๊ฐ์ธ๊ธฐ๋ง ํ๋ฉด ๋จ
layers.Bidirectional(layers.LSTM(64)),
layers.Dropout(0.5), # ๊ณผ์ ํฉ ๋ฐฉ์ง๋ฅผ ์ํ ๋๋กญ์์ ์ถ๊ฐ
layers.Dense(1, activation='sigmoid')
])
5. ๊ฒฐ๋ก
์ค๋์ ์์ฐจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ RNN์ ํต์ฌ ์๋ฆฌ๋ถํฐ ์์ํ์ฌ, ์ค์ ์ฝ๋๋ก ๋ชจ๋ธ์ ๊ตฌํํ๊ณ , LSTM, GRU, ์๋ฐฉํฅ RNN๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์์ธํ๊ฒ ์์๋ณด์์ต๋๋ค.
RNN์ ๊ทธ ์์ฒด๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ์์ฐ์ด ์ฒ๋ฆฌ ๋ถ์ผ์ ๋ฐ์ ์ ์์ฒญ๋ ๊ธฐ์ฌ๋ฅผ ํ ๊ธฐ๋
๋น์ ์ธ ๋ชจ๋ธ์
๋๋ค.
ํนํ RNN์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ค๋ ์๋ ์์์ ํ์ํ ์ดํ
์
(Attention) ๋ฉ์ปค๋์ฆ์ ์ดํ **ํธ๋์คํฌ๋จธ(Transformer)**๋ผ๋ ํ์ ์ ์ธ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ด ๋์์ต๋๋ค.
๋ค์์๋ ์ค๋ ์งง๊ฒ ์์๋ณธ LSTM๊ณผ GRU๋ก ๋์์ค๊ฒ ์ต๋๋ค!!
์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์!!
- Downloads last month
- 28
# !pip install -U keras tensorflow huggingface_hub # Keras needs TensorFlow installed to read "hf://" paths, so the tensorflow backend is selected here; # "jax" and "torch" also work for computation once TensorFlow is installed. import os os.environ["KERAS_BACKEND"] = "tensorflow" import keras model = keras.saving.load_model("hf://OneclickAI/RNN_test_Model")