Home [TIL] 딥러닝 3. RNN 실습(Python)
Post
Cancel

[TIL] 딥러닝 3. RNN 실습(Python)

LG Aimers 5기 AI 실습 교육 수강 내용을 정리합니다. 모든 자료는 교육 플랫폼 앨리스로부터 제공받았습니다.

RNN(Recurrent Neural Network)

RNN은 시계열 데이터와 같은 순차 데이터 처리를 위한 대표적인 딥러닝 모델

지난 시간 학습한 RNN을 파이썬으로 구현해 보았습니다.

[ Vanilla RNN 코드 ]

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' ## 텐서플로우 간단한 경고 뜨지 않도록 설정

import tensorflow as tf
from tensorflow.keras import layers, Sequential

def build_model1():
    '''
    layers.Embedding
    - 전체 단어 개수: 10개
    - 벡터 길이: 5

    layers.SimpleRNN
    - hidden state의 크기: 3
    '''
    model = Sequential()
    
    model.add(layers.Embedding(10, 5)) ## input_dim, output_dim
    model.add(layers.SimpleRNN(3)) ## hidden_state(=vector) 크기
    
    return model

def build_model2():
    '''
    layers.Embedding
    - 전체 단어 개수: 256개
    - 벡터 길이: 100
    layers.SimpleRNN
    - hidden state의 크기: 20
    layers.Dense
    - 노드 개수: 10
    - 활성화 함수: softmax
    '''
    model = Sequential()
    
    model.add(layers.Embedding(256, 100))
    model.add(layers.SimpleRNN(20))
    model.add(layers.Dense(10, activation = 'softmax')) ## RNN으로 분류하기 위해 Dense layer 추가
    
    return model
    
def main():
    model1 = build_model1()
    print("=" * 20, "첫번째 모델", "=" * 20)
    model1.summary()
    ## 모델 성능에 도움이 되는 벡터로 임베딩되고, 그 벡터로 학습함

    print()
    
    model2 = build_model2()
    print("=" * 20, "두번째 모델", "=" * 20)
    model2.summary()

if __name__ == "__main__":
    main()

[ Vanilla RNN으로 IMDb 데이터 학습하기 ]

  • Dataset : IMDb 영화별 리뷰에 대한 긍/부정 데이터
  • Task : 감성 분석(Sentimental Analysis)

```python 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 from tensorflow.keras.datasets import imdb from tensorflow.keras.preprocessing.sequence import pad_sequences

def load_data(num_words, max_len): # imdb 데이터셋을 불러옵니다. # 데이터셋에서 단어는 num_words 개를 가져옵니다. (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=num_words)

1
2
3
4
5
6
# 단어 개수가 다른 문장들을 Padding을 추가하여
# 단어가 가장 많은 문장의 단어 개수로 통일합니다.
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

def build_rnn_model(num_words, embedding_len): model = Sequential()

1
2
3
4
5
6
model.add(layers.Embedding(num_words, embedding_len))
model.add(layers.SimpleRNN(16))
model.add(layers.Dense(1, activation="sigmoid")) # 분류
# sigmoid를 통해 도출된 0~1 사이의 값(=긍정일 확률)

return model

def main(model=None, epochs=5): # IMDb 데이터셋에서 가져올 단어의 개수 num_words = 6000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 각 문장이 가질 수 있는 최대 단어 개수
max_len = 130

# 임베딩 된 벡터의 길이
embedding_len = 100

# IMDb 데이터셋을 불러옵니다.
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(optimizer = optimizer, loss = "binary_crossentropy", 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()

This post is licensed under CC BY 4.0 by the author.

[TIL] 딥러닝 3. RNN

24.11.05(Tue)

Comments powered by Disqus.

Comments powered by Disqus.