케라스와 함께하는 쉬운 딥러닝 (22) - 순환형 신경망(RNN) 모델 만들기 5
02 Aug 2019 | Python Keras Deep Learning 케라스순환형 신경망 8 - CuDNNGRU & CuDNNLSTM
Objective: 케라스로 CuDNNLSTM과 CuDNNGRU 모델을 구현해 본다
이번 포스팅에서는 GPU를 활용하여 기존의 LSTM/GRU보다 더 빠르게 학습할 수 있는 CuDNNLSTM과 CuDNNGRU를 구현해 보자.
데이터 셋 불러오기
CNN-RNN 모델을 학습하기 위한 IMDB 데이터 셋을 불러온다.
num_words = 30000
maxlen = 300
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words = num_words)
# pad the sequences with zeros
# padding parameter is set to 'post' => 0's are appended to end of sequences
X_train = pad_sequences(X_train, maxlen = maxlen, padding = 'post')
X_test = pad_sequences(X_test, maxlen = maxlen, padding = 'post')
X_train = X_train.reshape(X_train.shape + (1,))
X_test = X_test.reshape(X_test.shape + (1,))
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
(25000, 300, 1)
(25000, 300, 1)
(25000,)
(25000,)
LSTM
CuDNN을 활용하지 않은 기존의 LSTM
def lstm_model():
model = Sequential()
model.add(LSTM(50, input_shape = (300,1), return_sequences = True))
model.add(LSTM(1, return_sequences = False))
model.add(Activation('sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
return model
model = lstm_model()
%%time
model.fit(X_train, y_train, batch_size = 100, epochs = 10, verbose = 0)
Wall time: 29min 40s
기존의 LSTM 모델은 epoch 10회를 학습하는 데 30분 가량 걸리는 것을 볼 수 있다.
GRU
CuDNN을 활용하지 않은 기존의 GRU
def gru_model():
model = Sequential()
model.add(GRU(50, input_shape = (300,1), return_sequences = True))
model.add(GRU(1, return_sequences = False))
model.add(Activation('sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
return model
model = gru_model()
%%time
model.fit(X_train, y_train, batch_size = 100, epochs = 10, verbose = 0)
Wall time: 21min 46s
기존의 GRU 모델은 학습에 있어 20분 정도 걸리는 것을 볼 수 있다. GRU가 LSTM에 비해 셀 구조가 단순해 LSTM에 비해서 적은 학습 시간을 필요로 한다.
CuDNN LSTM
CuDNN을 활용한 CuDNNLSTM
def cudnn_lstm_model():
model = Sequential()
model.add(CuDNNLSTM(50, input_shape = (300,1), return_sequences = True))
model.add(CuDNNLSTM(1, return_sequences = False))
model.add(Activation('sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
return model
model = cudnn_lstm_model()
%%time
model.fit(X_train, y_train, batch_size = 100, epochs = 10, verbose = 0)
Wall time: 2min 53s
CuDNN LSTM은 3분 이내의 학습 시간을 보이며 기존의 LSTM에 비해 10배 가량 빠른 학습 속도를 보여준다.
CuDNN GRU
CuDNN을 활용한 GRU
def cudnn_gru_model():
model = Sequential()
model.add(CuDNNGRU(50, input_shape = (300,1), return_sequences = True))
model.add(CuDNNGRU(1, return_sequences = False))
model.add(Activation('sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
return model
model = cudnn_gru_model()
%%time
model.fit(X_train, y_train, batch_size = 100, epochs = 10, verbose = 0)
Wall time: 1min 54s
CuDNN GRU도 역시 기존의 GRU에 비해 10배 가량 빠른 학습 속도를 보여준다.
전체 코드
본 실습의 전체 코드는 여기에서 열람하실 수 있습니다!