본문 바로가기

텍스트 마이닝

RNN-딥러닝을 이용한 문서 분류 (4)

반응형

10.3 RNN을 이용한 문서 분류

10.3.2 RNN이 아닌 일반적인 신경망 모형을 이용한 분류

  • 임베딩 레이어, Flatten() 레이어, Dense() 레이어로 이루어진 Sequential 모형
# 케라스 모형 생성 및 학습
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense, Embedding

model = Sequential([ #순차적 모형
    Embedding(max_words, 32, input_length=maxlen), #word embedding layer 생성
    # max_words는 one-hot encoding을 할 때의 vector 크기가 됨 - 사용된 단어의 수만큼
    # 각 단어는 32 크기의 dense vector로 embedding 됨
    # input_length는 한 document의 단어 수로 표현
    # 이 과정을 거치면 각 document는 (maxlen, 32)의 2차원 행렬이 됨 - 즉 word의 sequence가 됨

    Flatten(), # 2차원 행렬을 1차원으로 펼침
    Dense(1, activation='sigmoid') #binary logistic regression을 수행
])

model.summary() #모델의 요약정보 출력

"""
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding (Embedding)       (None, 500, 32)           320000    
                                                                 
 flatten (Flatten)           (None, 16000)             0         
                                                                 
 dense (Dense)               (None, 1)                 16001     
                                                                 
=================================================================
Total params: 336,001
Trainable params: 336,001
Non-trainable params: 0
_________________________________________________________________
"""
# 모형의 optimizer와 loss function 등을 지정
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
# 학습을 수행
history = model.fit(X_train, y_train,
                    epochs=10,
                    verbose=1,
                    validation_split=0.2)
                    
"""
Epoch 1/10
40/40 [==============================] - 1s 19ms/step - loss: 0.6920 - acc: 0.5086 - val_loss: 0.6903 - val_acc: 0.5344
Epoch 2/10
40/40 [==============================] - 1s 13ms/step - loss: 0.6153 - acc: 0.8797 - val_loss: 0.6843 - val_acc: 0.5437
Epoch 3/10
40/40 [==============================] - 1s 14ms/step - loss: 0.5128 - acc: 0.9641 - val_loss: 0.6719 - val_acc: 0.5656
Epoch 4/10
40/40 [==============================] - 1s 13ms/step - loss: 0.3815 - acc: 0.9898 - val_loss: 0.6532 - val_acc: 0.6250
Epoch 5/10
40/40 [==============================] - 1s 13ms/step - loss: 0.2525 - acc: 0.9969 - val_loss: 0.6330 - val_acc: 0.6438
Epoch 6/10
40/40 [==============================] - 1s 12ms/step - loss: 0.1515 - acc: 0.9984 - val_loss: 0.6238 - val_acc: 0.6438
Epoch 7/10
40/40 [==============================] - 0s 9ms/step - loss: 0.0855 - acc: 0.9992 - val_loss: 0.6131 - val_acc: 0.6469
Epoch 8/10
40/40 [==============================] - 0s 9ms/step - loss: 0.0466 - acc: 1.0000 - val_loss: 0.6200 - val_acc: 0.6313
Epoch 9/10
40/40 [==============================] - 0s 10ms/step - loss: 0.0255 - acc: 1.0000 - val_loss: 0.6092 - val_acc: 0.6625
Epoch 10/10
40/40 [==============================] - 0s 12ms/step - loss: 0.0146 - acc: 1.0000 - val_loss: 0.6370 - val_acc: 0.6375
"""
%matplotlib inline
import matplotlib.pyplot as plt

def plot_results(history, metric):
    plt.plot(history.history[metric], 'b', label='Training '+metric)
    plt.plot(history.history['val_'+metric], 'r--', label='Validation '+metric)
    plt.title('Training vs. Validation '+metric)
    plt.xlabel('Epochs')
    plt.ylabel(metric)
    plt.legend()
    plt.show()

plot_results(history, 'acc')

#테스트 셋으로 학습된 모형의 성능을 평가
score = model.evaluate(X_test, y_test)
print(f'#Test accuracy:{score[1]:.3f}')

"""
13/13 [==============================] - 0s 3ms/step - loss: 0.6299 - acc: 0.6525
#Test accuracy:0.652
"""

 

 

 

 

 

※ 해당 내용은 <파이썬 텍스트 마이닝 완벽 가이드>의 내용을 토대로 학습하며 정리한 내용입니다.

반응형