9장 텍스트 분류 – 순환 신경망(4)

9-3 TensorFlow로 순환 신경망 만들기

– SimpleRNN 클래스를 사용하여 순환 신경망 생성

1. 반복 신경망에 필요한 클래스 가져오기

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN

2. 모델 구축

model = Sequential()

model.add(SimpleRNN(32, input_shape=(100, 100)))
model.add(Dense(1, activation='sigmoid'))

model.summary()


"""
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simple_rnn (SimpleRNN)      (None, 32)                4256      
                                                                 
 dense (Dense)               (None, 1)                 33        
                                                                 
=================================================================
Total params: 4,289
Trainable params: 4,289
Non-trainable params: 0
_________________________________________________________________
"""

3. 모델 컴파일 및 학습

model.compile(optimizer="sgd", loss="binary_crossentropy", metrics=('accuracy'))

history = model.fit(x_train_onehot, y_train, epochs=20, batch_size=32, 
                    validation_data=(x_val_onehot, y_val))
                    
                    
"""
Epoch 1/20
625/625 (==============================) - 16s 23ms/step - loss: 0.7025 - accuracy: 0.5001 - val_loss: 0.6973 - val_accuracy: 0.4982
Epoch 2/20
625/625 (==============================) - 14s 22ms/step - loss: 0.6949 - accuracy: 0.5084 - val_loss: 0.6953 - val_accuracy: 0.5096
Epoch 3/20
625/625 (==============================) - 15s 24ms/step - loss: 0.6927 - accuracy: 0.5174 - val_loss: 0.6944 - val_accuracy: 0.5106
Epoch 4/20
625/625 (==============================) - 14s 22ms/step - loss: 0.6907 - accuracy: 0.5313 - val_loss: 0.6910 - val_accuracy: 0.5268
Epoch 5/20
625/625 (==============================) - 13s 21ms/step - loss: 0.6882 - accuracy: 0.5424 - val_loss: 0.6873 - val_accuracy: 0.5390
Epoch 6/20
625/625 (==============================) - 13s 21ms/step - loss: 0.6814 - accuracy: 0.5609 - val_loss: 0.6827 - val_accuracy: 0.5640
Epoch 7/20
625/625 (==============================) - 13s 22ms/step - loss: 0.6652 - accuracy: 0.5943 - val_loss: 0.6580 - val_accuracy: 0.6044
Epoch 8/20
625/625 (==============================) - 14s 22ms/step - loss: 0.6413 - accuracy: 0.6295 - val_loss: 0.6408 - val_accuracy: 0.6292
Epoch 9/20
625/625 (==============================) - 14s 22ms/step - loss: 0.6258 - accuracy: 0.6507 - val_loss: 0.6381 - val_accuracy: 0.6364
Epoch 10/20
625/625 (==============================) - 14s 22ms/step - loss: 0.6121 - accuracy: 0.6662 - val_loss: 0.6140 - val_accuracy: 0.6718
Epoch 11/20
625/625 (==============================) - 14s 22ms/step - loss: 0.6180 - accuracy: 0.6653 - val_loss: 0.6658 - val_accuracy: 0.5914
Epoch 12/20
625/625 (==============================) - 17s 27ms/step - loss: 0.5998 - accuracy: 0.6801 - val_loss: 0.5900 - val_accuracy: 0.6852
Epoch 13/20
625/625 (==============================) - 14s 22ms/step - loss: 0.5929 - accuracy: 0.6855 - val_loss: 0.5860 - val_accuracy: 0.6956
Epoch 14/20
625/625 (==============================) - 14s 23ms/step - loss: 0.5892 - accuracy: 0.6899 - val_loss: 0.7233 - val_accuracy: 0.6402
Epoch 15/20
625/625 (==============================) - 14s 22ms/step - loss: 0.5837 - accuracy: 0.6950 - val_loss: 0.6422 - val_accuracy: 0.6772
Epoch 16/20
625/625 (==============================) - 13s 22ms/step - loss: 0.5816 - accuracy: 0.6949 - val_loss: 0.6208 - val_accuracy: 0.6650
Epoch 17/20
625/625 (==============================) - 13s 22ms/step - loss: 0.5744 - accuracy: 0.7033 - val_loss: 0.5887 - val_accuracy: 0.7032
Epoch 18/20
625/625 (==============================) - 13s 22ms/step - loss: 0.5741 - accuracy: 0.6999 - val_loss: 0.5705 - val_accuracy: 0.7078
Epoch 19/20
625/625 (==============================) - 13s 21ms/step - loss: 0.5745 - accuracy: 0.6996 - val_loss: 0.5740 - val_accuracy: 0.6996
Epoch 20/20
625/625 (==============================) - 15s 24ms/step - loss: 0.5689 - accuracy: 0.7031 - val_loss: 0.6904 - val_accuracy: 0.6422
"""

4. 교육 및 검증 세트에 대한 손실 및 정확도 플롯 그리기

plt.plot(history.history('loss'))
plt.plot(history.history('val_loss'))
plt.show()


plt.plot(history.history('accuracy'))
plt.plot(history.history('val_accuracy'))
plt.show()


5. 유효성 검사 세트의 정확도 평가

loss, accuracy = model.evaluate(x_val_onehot, y_val, verbose=0)
print(accuracy)


##출력: 0.6421999931335449
반응형


– 임베딩 레이어로 순환 신경망 모델의 성능 향상

원-핫 인코딩은 단어 간의 관계를 잘 나타내지 않습니다.

-> Word Embedding은 이 문제를 해결하기 위해 개발되었습니다.


1. 임베딩 클래스 가져오기

from tensorflow.keras.layers import Embedding

2. 학습 데이터 준비

(x_train_all, y_train_all), (x_test, y_test) = imdb.load_data(skip_top=20, num_words=1000)

for i in range(len(x_train_all)):
    x_train_all(i) = (w for w in x_train_all(i) if w > 2)
    
x_train = x_train_all(random_index(:20000))
y_train = y_train_all(random_index(:20000))
x_val = x_train_all(random_index(20000:))
y_val = y_train_all(random_index(20000:))

3. 샘플 길이 조정

maxlen=100
x_train_seq = sequence.pad_sequences(x_train, maxlen=maxlen)
x_val_seq = sequence.pad_sequences(x_val, maxlen=maxlen)

4. 모델 구축

model_ebd = Sequential()

model_ebd.add(Embedding(1000, 32))
model_ebd.add(SimpleRNN(8))
model_ebd.add(Dense(1, activation='sigmoid'))

model_ebd.summary()


"""
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding (Embedding)       (None, None, 32)          32000     
                                                                 
 simple_rnn_1 (SimpleRNN)    (None, 8)                 328       
                                                                 
 dense_1 (Dense)             (None, 1)                 9         
                                                                 
=================================================================
Total params: 32,337
Trainable params: 32,337
Non-trainable params: 0
_________________________________________________________________
"""

5. 모델 컴파일 및 학습

model_ebd.compile(optimizer="adam", loss="binary_crossentropy", metrics=('accuracy'))

history = model_ebd.fit(x_train_seq, y_train, epochs=10, batch_size=32, 
                        validation_data=(x_val_seq, y_val))
                        
                        
"""
Epoch 1/10
625/625 (==============================) - 18s 25ms/step - loss: 0.5244 - accuracy: 0.7362 - val_loss: 0.4544 - val_accuracy: 0.7988
Epoch 2/10
625/625 (==============================) - 17s 27ms/step - loss: 0.4029 - accuracy: 0.8270 - val_loss: 0.4190 - val_accuracy: 0.8150
Epoch 3/10
625/625 (==============================) - 16s 26ms/step - loss: 0.3518 - accuracy: 0.8537 - val_loss: 0.4066 - val_accuracy: 0.8282
Epoch 4/10
625/625 (==============================) - 15s 24ms/step - loss: 0.3223 - accuracy: 0.8698 - val_loss: 0.4144 - val_accuracy: 0.8196
Epoch 5/10
625/625 (==============================) - 15s 24ms/step - loss: 0.3131 - accuracy: 0.8712 - val_loss: 0.4225 - val_accuracy: 0.8230
Epoch 6/10
625/625 (==============================) - 17s 27ms/step - loss: 0.2826 - accuracy: 0.8880 - val_loss: 0.4257 - val_accuracy: 0.8222
Epoch 7/10
625/625 (==============================) - 15s 25ms/step - loss: 0.2597 - accuracy: 0.9000 - val_loss: 0.4343 - val_accuracy: 0.8166
Epoch 8/10
625/625 (==============================) - 15s 25ms/step - loss: 0.2451 - accuracy: 0.9053 - val_loss: 0.5036 - val_accuracy: 0.8006
Epoch 9/10
625/625 (==============================) - 15s 24ms/step - loss: 0.2433 - accuracy: 0.9074 - val_loss: 0.5037 - val_accuracy: 0.8166
Epoch 10/10
625/625 (==============================) - 15s 24ms/step - loss: 0.2230 - accuracy: 0.9161 - val_loss: 0.4878 - val_accuracy: 0.8040
"""

6. 손실 및 정확도 플롯 그리기

plt.plot(history.history('loss'))
plt.plot(history.history('val_loss'))
plt.show()


plt.plot(history.history('accuracy'))
plt.plot(history.history('val_accuracy'))
plt.show()


7. 유효성 검사 세트의 정확도 평가

loss, accuracy = model_ebd.evaluate(x_val_seq, y_val, verbose=0)
print(accuracy)


##출력: 0.8040000200271606

※ 내용 배우고 조직하는 것.