Keras - RNN
- 순환 신경망 이해
- feedforward network : 전체 시퀀스를 하나의 데이터 포인트로 변환하여 처리
- 사람이 문장을 읽는 것처럼 이전에 나온 것을 기억하면서 단어별로 또는 한눈에 들어오는 만큼씩 처리.
- 문장의 의미를 자연스럽게 표현하도록 도움
- 과거 정보를 사용하여 구축되며 새롭게 얻은 정보를 계속 업데이트
- 시퀀스의 원소를 순회하면서 지금까지 처리한 정보를 상태(state)에 저장
- 내부에 루프(loop)를 가진 신경망의 한 종류
- RNN의 상태는 2개의 다른 시퀀스를 처리하는 사이에 재설정됨.
- 하나의 시퀀스가 여전히 하나의 데이터 포인트로 간주. 즉 네트워크에 하나의 입력을 주입한다고 가정. 이 데이터 포인트가 한번에 처리되지 않는다는 점이 다름.
- RNN은 크기가 (timesteps, input_features)인 2D 텐서로 인코딩된 벡터의 시퀀스를 입력받음.
- 각 타임스텝 t에서 현재 상태와 ((input_features,) 크기)의 입력을 연결하여 출력 계산
- 출력을 다음 스텝의 상태로 설정
- 첫번째 타임스텝은 현재 상태가 없음
- 의사코드
- 심플RNN 넘파이 구현 코드
- SimpleRNN의 최종출력 반환 모델
- SimpleRNN 전체출력 시퀀스 반환 모델
- 여러개의 순환층 전체출력 시퀀스 반환 설정
- IMDB 데이터 전처리
- 임베딩 층과 심플RNN 층 사용한 모델 훈련
- 각 타임스텝 t에서 현재 상태와 ((input_features,) 크기)의 입력을 연결하여 출력 계산
- 출력을 다음 스텝의 상태로 설정
- 첫번째 타임스텝은 현재 상태가 없음
- 의사코드
state_t = 0for input_t in input_sequence: output_t = activation(dot(W, input_t) + dot(U, state_t) + b) state_t = output_t
- 심플RNN 넘파이 구현 코드
import numpy as np timesteps = 100input_features = 32output_features = 64 inputs = np.random.random((timesteps, input_features)) state_t = np.zeros((output_features,)) W = np.random.random((output_features, input_features)) U = np.random.random((output_features, output_features)) b = np.random.random((output_features,)) successive_outputs = [] for input_t in inputs: output_t = np.tanh(np.dot(W, input_t) + np.dot(U, state_t) + b) successive_outputs.append(output_t) state_t = output_t final_output_sequence = np.stack(successive_outputs, axis=0)
- SimpleRNN의 최종출력 반환 모델
#SimpleRNN 사용 (2D 텐서로 반환됨. 최종 출력만 반환)from keras.models import Sequential from keras.layers import Embedding, SimpleRNN model = Sequential() model.add(Embedding(10000,32)) model.add(SimpleRNN(32)) model.summary()
- SimpleRNN 전체출력 시퀀스 반환 모델
#전체출력 시퀀스 반환 설정 (3D 텐서로 반환됨)model = Sequential() model.add(Embedding(10000,32)) model.add(SimpleRNN(32, return_sequences=True)) model.summary()
- 여러개의 순환층 전체출력 시퀀스 반환 설정
#여러개의 순환층 전체출력 시퀀스 반환 설정model = Sequential() model.add(Embedding(10000,32)) model.add(SimpleRNN(32, return_sequences=True)) model.add(SimpleRNN(32, return_sequences=True)) model.add(SimpleRNN(32, return_sequences=True)) model.add(SimpleRNN(32)) model.summary()
- IMDB 데이터 전처리
from keras.datasets import imdb from keras.preprocessing import sequence max_features = 10000 #특성으로 사용할 단어수maxlen = 500 #사용할 텍스트의 길이(가장 빈번한 max_features개의 단어만 사용)batch_size = 32 print("데이터 로딩...") (input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features) print(len(input_train), '훈련 시퀀스') print(len(input_test), '테스트 시퀀스') print('시퀀스 패딩 (samples x time)') input_train = sequence.pad_sequences(input_train, maxlen=maxlen) input_test = sequence.pad_sequences(input_test, maxlen=maxlen) print('input_train 크기:', input_train.shape) print('input_test 크기:', input_test.shape)
- 임베딩 층과 심플RNN 층 사용한 모델 훈련
from keras.layers import Dense model = Sequential() model.add(Embedding(max_features, 32)) model.add(SimpleRNN(32)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) history = model.fit(input_train, y_train, epochs=10, batch_size=128, validation_split=0.2)
댓글
댓글 쓰기