728x90
반응형
이 예제에서 리뷰 텍스트를 기반으로 영화 리뷰를 긍정(positive)과 부정(nagative)으로 분류하는 방법을 연습해 보았다.
IMDB 데이터셋도 케라스에 포함되어 있으며, 이 데이터는 전처리되어 있어 각 리뷰(단어 시퀀스)가 숫자 시퀀스로 변환되어 있다. 여기서 각 숫자는 사전에 있는 고유한 단어를 나타낸다.
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))
과대적합이 일어남( 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
반응형
'딥러닝 (Deep Learning) > 딥러닝 분석연습' 카테고리의 다른 글
뉴스 기사 분류 : 로이터(Reuters) 데이터셋 (병목현상, 레이블을 벡터로 바꾸는 방법들 2가지) (0) | 2021.04.27 |
---|---|
Keras 정의, 특징, 사용법 (0) | 2021.04.21 |
MNIST - practice1,2 + 자세한 설명 (0) | 2021.04.11 |
tensorflow.keras 손글씨 MNIST (0) | 2021.04.07 |