딥러닝 (Deep Learning)/딥러닝 분석연습

영화 리뷰 분류 : IMDB(Internet Movie Database)

DS지니 2021. 4. 26. 16:56
728x90
반응형

이 예제에서 리뷰 텍스트를 기반으로 영화 리뷰를 긍정(positive)과 부정(nagative)으로 분류하는 방법을 연습해 보았다.

IMDB 데이터셋도 케라스에 포함되어 있으며, 이 데이터는 전처리되어 있어 각 리뷰(단어 시퀀스)가 숫자 시퀀스로 변환되어 있다. 여기서 각 숫자는 사전에 있는 고유한 단어를 나타낸다.

 

>> 전체코드

 

gggggeun/study

Contribute to gggggeun/study development by creating an account on GitHub.

github.com

 

1. 신경망 모델

# 16개의 은닉 유닛을 가진 2개의 은닉층
# 현재 리뷰의 감정을 스칼라 값의 예측으로 출력하는 세 번째 층
# 은닉층 활성화 함수 relu(음수는 0), 출력층 활성화 함수 sigmoid(0~1 사이의 점수)
# optimizer='rmsprop', loss='binary_crossentropy', metrics='acc'
# epochs = 20, batch_size=512

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

# train / validation 나누기
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]


model.compile(optimizer='rmsprop',
              loss = 'binary_crossentropy',
              metrics=['acc'])
history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=20,
                    batch_size=512,
                    validation_data=(x_val, y_val))

val_loss : 68%, val_acc : 86%

 

과대적합이 일어남( validation에서 성능이 떨어짐 )

이유 : epochs가 너무 큼. (그래프로 확인하니 epochs 4 이후부터 성능이 안좋아짐.)

 

2. 실험

*optimizer ='rmsprop' 고정

epochs 은닉 층
개수
은닉유닛
개수
loss function 활성화
함수
Loss
Accuracy
state
20 2 16,16 binary_crossentropy relu, sigmoid 0.68 (val)
86% (val)
과대적합
4 2 16,16 binary_crossentropy relu, sigmoid 0.29 (test)
88.3% (test)
epochs를 4로 줄여 과대적합을 방지. loss가 많이 줄었다.
4 1 16 binary_crossentropy relu, sigmoid 0.28 (test)
88.5% (test)
은닉층 개수를 1개로 줄였더니 성능이 아주 조금 좋아졌다.
4 3 16,16,16 binary_crossentropy relu, sigmoid 0.3
88.1%
 
4 5 16,16,16,16,16 binary_crossentropy relu, sigmoid 0.32
87.3%
 
4 2 32,32 binary_crossentropy relu, sigmoid 0.33
87.0%
 
4 2 16,32 binary_crossentropy relu, sigmoid 0.31
87.8%
 
4 4 16,32,64,64 binary_crossentropy relu, sigmoid 0.34
87.3%
 
4 2 64,64 binary_crossentropy relu, sigmoid 0.36
87.0%
 
4 2 8,16 binary_cross
entropy
relu, sigmoid 0.31
87.3%
 
4 1 16 mse relu, sigmoid 0.085
88.59%
mse를 사용했더니 loss가 많이 줄었다.
4 1 16 mse tanh, sigmoid 0.085
88.50%
 
4 2 16 mse relu, sigmoid 0.089
88.2%
 
10 5 32,64,64,64,16 mse relu, sigmoid 0.106
87.2%
 
10 5 16,16,16,16,16 mse relu, sigmoid 0.108
86.07%
 
5 2 16,16 mse relu, sigmoid 0.087
88.39%
이정도가 좋음.

1. mse 사용 시 loss가 많이 줄었음. 정확도는 별로 안오름.(1%)

2. 은닉층 수가 1개~2개일 때와 유닛 수가 16일 때 성능이 좋은 편.

3. 활성화함수는 relu와 sigmoid를 쓰는 걸로. (relu가 성능이좋음)

4. 그 외 배치사이즈 조정은 성능이 왔다갔다라 잘 모르겠음.

5. epochs는 4 정도 일 때 성능이 좋다.

6. optimizer = adam 성능이 조금 떨어졌지만, 비슷했다.

 


 

3. 정리

  • 원본 데이터를 신경망에 텐서로 주입하기 위해서는 꽤 많은 전처리가 필요함. 단어 시퀀스는 이진 벡터로 인코딩될 수 있고 다른 인코딩 방식도 있음.
  • relu 활성화 함수와 함께 Dens층을 쌓은 네트워크는 (감정분류포함) 여러 종류의 문제에 적용할 수 있어 앞으로 자주 사용하게 될 것임.
  • (출력 클래스가 2개인) 이진 분류 문제에서 네트워크는 하나의 유닛과 sigmoid활성화 함수를 가진 Dense층으로 끝나야 한다. 이 신경망의 출력은 확률을 나타내는 0과 1 사이의 스칼라 값이다.
  • 이진 분류 문제에서 이런 스칼라 시그모이드 출력에 대해 사용할 손실 함수는 binary_crossentropy이다. (하지만 IMDB에서는 MSE가 손실을 엄청 줄여줬다.)
  • rmsprop 옵티마이저는 문제에 상관없이 일반적으로 충분히 좋은 선택이다. good!
  • 훈련 데이터에 대해 성능이 향상됨에 따라 신경망은 과대적합되기 시작하고 이전에 본적 없는 데이터에서는 결과가 점점 나빠지게 된다. 항상 훈련 세트 이외의 데이터에서 성능을 모니터링해야 한다.
728x90
반응형