일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 합성곱 신경망
- 텍스트 마이닝
- 과적합
- 성능 최적화
- 완전연결층
- 클러스터링
- 시계열 분석
- 망각 게이트
- 자연어 전처리
- KONLPY
- cnn
- 전이학습
- 합성곱층
- 코딩테스트
- 프로그래머스
- 양방향 RNN
- 순환 신경망
- 이미지 분류
- 원-핫 인코딩
- NLTK
- 생성모델
- 코랩
- 입력층
- COLAB
- 딥러닝
- RNN
- 임베딩
- 풀링층
- 출력층
- 카운트 벡터
Archives
- Today
- Total
Colab으로 하루에 하나씩 딥러닝
시계열 분석_3.LSTM 본문
728x90
LSTM(Long short-term memory)
- RNN의 최적화하기 어렵도 성능적인 한계를 해결하기 위하여 사용
- 기울기 소실문제: RNN는 가중치가 업데이트되는 과정에서 1보다 작은 값이 계속 곱해지기 때문에 기울기 소실문제가 발생함
- 장기의존성: 순차열 길어질수록 오래전에 입력된 데이터의 정보가 사라지기 때문에 예측이 어려움
- 셀 상태와 은닉 상태로 장기 기억과 단기 기억을 모델링
LSTM 구조
1. 순전파
- 셀: 각 단계에 대한 은닉노드, 총합을 사용하여 기울기 소멸 문제를 해결
- 망각 게이트: 과거 정보를 어느 정도 기억할지 결정, 과거 정보를 시그모이드로 취하고 0이면 버리고, 1이면 온전하게 보전
- 입력 게이트: 현재 정보를 기억하기 위해 만듦, 시그모이드와 하이퍼볼릭 탄젠트 함수를 기반으로 현재 정보에 대한 보존량 결정
- 기억 게이트: 장기 기억을 새롭게 갱신하기 위해 망각 게이트를 통과한 장기 기억에 입력 게이트를 통과한 새로운 기억을 더함
- 출력 게이트: 과거 정보와 현재 데이터를 사용하여 뉴런의 출력을 결정
2. 역전파
- 최종 오차는 모든 노드에 전파됨, 셀을 통해서 중단 없이 전파됨
- 셀 단위로 오차가 전파된다고 해서 입력 방향으로 오차가 전파되지 않음
LSTM 실습
2023.01.16 - [딥러닝_개념] - 시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현
시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현
### 라이브러리 호출 import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = "2" 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.l
elleik.tistory.com
이전 게시물의 기반으로 실습 진행하기 때문에 이전글 확인 후 아래의 실습을 보시는 걸 추천드립니다.
이전 게시물과 동일하게 라이브러리 호출, 값 초기화, 데이터셋 준비를 실행합니다.
### 네트워크 생성
class LSTM_Build(tf.keras.Model):
def __init__(self, units):
super(LSTM_Build, self).__init__()
self.state0 = [tf.zeros([batch_size, units]), tf.zeros([batch_size, units])]
self.state1 = [tf.zeros([batch_size, units]), tf.zeros([batch_size, units])]
self.embedding = tf.keras.layers.Embedding(total_words, embedding_len, input_length=max_review_len)
self.RNNCell0 = tf.keras.layers.LSTMCell(units, dropout=0.5)
self.RNNCell1 = tf.keras.layers.LSTMCell(units, dropout=0.5)
self.outlayer = tf.keras.layers.Dense(1)
def call(self, inputs, training=None):
x = inputs
x = self.embedding(x)
state0 = self.state0 # 초기 상태 0으로 설정
state1 = self.state1
for word in tf.unstack(x, axis=1):
out0, state0 = self.RNNCell0(word, state0, training) # train 매개변수 추가
out1, state1 = self.RNNCell1(out0, state1, training)
x = self.outlayer(out1)
prob = tf.sigmoid(x)
return prob
### 모델 훈련
import time
units = 64
epochs = 4
t0 = time.time()
model = LSTM_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)
상세 설명
- RNN을 사용하는 것보다 테스트 데이터셋 평가가 81%에서 83%로 정확도가 높아짐
참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)
'딥러닝_개념' 카테고리의 다른 글
시계열 분석_5.양방향 RNN (0) | 2023.01.19 |
---|---|
시계열 분석_4.GRU (1) | 2023.01.18 |
시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현 (0) | 2023.01.16 |
시계열 분석_2.순환 신경망(RNN)_1)구조와 모델 (0) | 2023.01.13 |
시계열 분석_1.시계열 문제 & AR, MA, ARMA, ARIMA (0) | 2023.01.12 |