일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코랩
- 완전연결층
- 코딩테스트
- 순환 신경망
- 풀링층
- 합성곱 신경망
- RNN
- 양방향 RNN
- 입력층
- 이미지 분류
- cnn
- 전이학습
- 카운트 벡터
- 생성모델
- 클러스터링
- 프로그래머스
- 과적합
- COLAB
- KONLPY
- 시계열 분석
- 성능 최적화
- 텍스트 마이닝
- 합성곱층
- 딥러닝
- 자연어 전처리
- 출력층
- 원-핫 인코딩
- 망각 게이트
- NLTK
- 임베딩
Archives
- Today
- Total
Colab으로 하루에 하나씩 딥러닝
RNN_계층 구현(SimpleRNN) 본문
728x90
라이브러리 호출
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = "3" # 케라스에서 발생하는 경고 메세지를 제거
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
값 초기화
tf.random.set_seed(22)
np.random.seed(22)
assert tf.__version__.startswith('2.') # 텐서플로 버전이 2임을 확인
batch_size = 128
total_words = 10000
max_review_len = 80
embedding_len = 100
데이터셋 준비
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=total_words)
# IMDB 데이터셋을 내려받음
# num_words: 데이터에서 등장 빈도 순위로 몇번째에 해당하는 단어까지 사용할지 의미 -> 1~10000에 해당하는 단어만 사용
x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_review_len)
x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test, maxlen=max_review_len)
# 패딩(padding) 작업 실시 -> 0을 넣어서 길이가 다른 샘플들의 길이를 맞춤
# pad_sequence: 정해 준 길이보다 길이가 긴 샘플은 값을 일부 자르고, 정해 준 길이보다 길이가 짧은 샘플 값을 0으로 채움
# 첫번째 인자: 패딩을 진행할 데이터
# maxlen: 모든 데이터에 대해 정규화할 길이
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
# 넘파이 배열을 Dataset으로 변환, 변환하려는 전체 데이터를 메모리로 로딩해야 하므로 큰 용량의 메모리가 필요 -> Dataset의 from_generator를 사용하여 해결
# from_generator : 데이터를 한 번에 메모리에 로딩하는 것이 아니고, 필요할 때만 파이썬 generator를 통해 가져옴
train_data = train_data.shuffle(10000).batch(batch_size, drop_remainder=True)
# 데이터셋을 변형해 줌
# shuffle: 데이터 셋을 임의로 섞어줌
# batch : 데이터셋의 항목들을 하나의 배치로 묶어줌 / batch_size: 몇 개의 샘플로 가중치를 갱신할지 지정
# drop_remainder : 마지막 배치 크기를 무시하고 지정한 배치 크기를 사용
test_data = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_data = test_data.batch(batch_size, drop_remainder=True)
print('x_train_shape:', x_train.shape, tf.reduce_max(y_train), tf.reduce_min(y_train))
print('x_test_shape:', x_test.shape)
sample = next(iter(test_data))
print(sample[0].shape)
네트워크(신경망) 구축
class RNN_Build(tf.keras.Model):
def __init__(self,units):
super(RNN_Build, self).__init__()
self.embedding = tf.keras.layers.Embedding(total_words, embedding_len, input_length=max_review_len)
self.rnn = tf.keras.Sequential([
tf.keras.layers.SimpleRNN(units, dropout=0.5, return_sequences=True),
# 은닉 노드가 대수 개인 RNN 셀을 여러 개 구축 가능
# units: 네트워크의 층 수(출력 공간의 차원)
# dropout: 전체 노드 중 20% 값을 0으로 설정하여 사용하지 않겠다는 의미
# return_sequences: 마지막 출력 또는 전체 순서를 반환하는 것 / return_sequences=True는 출력 순서 중 마지막 값만 출력하는 것이 아니라 전체 순서열을 3차원 텐서 형태로 출력하라는 것
tf.keras.layers.SimpleRNN(units, dropout=0.5)
])
self.outlayer = tf.keras.layers.Dense(1)
def call(self, inputs, training=None):
x = inputs
x = self.embedding(x)
x = self.rnn(x)
x = self.outlayer(x)
prob = tf.sigmoid(x)
return prob
모델 훈련
import time
units = 64
epochs = 4
t0 = time.time()
model = RNN_Build(units)
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss=tf.losses.BinaryCrossentropy(),
metrics=['accuracy'],
experimental_run_tf_function=False)
model.fit(train_data, epochs=epochs, validation_data=test_data, validation_freq=2)
모델 평가
print("훈련 데이터셋 평가...")
(loss, accuracy) = model.evaluate(train_data, verbose=0)
print("loss={:.4f}, accuracy: {:.4f}%".format(loss,accuracy * 100))
print("테스트 데이터셋 평가...")
(loss, accuracy) = model.evaluate(test_data, verbose=0)
print("loss={:.4f}, accuracy: {:.4f}%".format(loss,accuracy * 100))
t1 = time.time()
print("시간:",t1-t0)
결과
- SimpleRNNCell과 SimpleRNN의 코드 구현은 거의 비슷
- SimpleRNNCell은 def call 함수에서 for문을 사용하여 반복 수행한다는 점이 다름
- SimpleRNNCell보다 훈련 데이터에 대한 정확도와 테스트 데이터셋에 대한 정확도가 낮아졌고, 수행 시간은 길어짐
2022.11.27 - [딥러닝_코드] - RNN_셀 구현
출처: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)
'딥러닝_코드' 카테고리의 다른 글
RNN_셀 구현(SimpleRNNCell) (0) | 2022.11.27 |
---|