-
다중 분류 문제
* 이진 분류와의 차이점 : 출력 클래스의 개수
다중 분류의 종류
- 단일 레이블 다중 분류 : 각 데이터 포인트가 하나의 클래스로 분류
- 다중 레이블 다중 분류 : 각 데이터 포인트가 여러개의 클래스에 속함
새롭게 알게 된 내용
1. 레이블의 one hot encoding 방법
데이터들을 벡터화 했던 것처럼, 직접 함수로 구현할 수도 있지만
케라스의 to_categorical(train_labels) 를 통해 벡터로 변환시킬 수 있음
2. 다중분류의 모델 층 구성방법
이진분류와 다른 점 : 출력 클래스의 개수가 늘어남
따라서, 중간층의 차원을 늘려주어야 함!
기존에 16차원이었던 것을 64차원으로 증가시켜야 함
그렇지 않으면, 정보의 병목 지점이 될 수 있음
또한, 마지막 층의 크기는 클래스의 개수만큼 해주어야 함!
(예를 들어, 클래스의 개수가 46개라면, 마지막 층은 46차원이어야 함)
마지막 층은 활성화 함수로 softmax를 사용해야 함
* 정보의 병목 : Dense층에서는 이전 층의 출력에서 제공된 정보만 사용 가능.
따라서, 일부 정보 누락하면 다시는 복원할 수 X
-> 규모가 작은 층은 유용한 정보 잃게 됨
3. 다중분류의 손실 함수
이진분류에서는 binary_crossentropy를 사용하였지만,
다중분류에서는 categorical_crossentropy를 사용해야 함
-> 두 확률 분포 사이의 거리 측정하여 거리를 최소화하는 출력을 내도록 훈련시킴
4. 레이블을 인코딩 하는 방법 中 정수 텐서로 변환하는 방법
y_train = np.array(train_labels)
위와 같이 정수 텐서로 변환함.
이때에는 손실함수로 sparse_categorical_crossentropy를 사용해야 함
categorical_crossentropy는 레이블이 범주형 인코딩되어있을 것으로 기대하기 때문에 사용할 수 X
* 레이블을 인코딩하는 또다른 방법은 이진분류에서 다뤘던 one-hot-encoding!
즉, 레이블을 인코딩할 때에는 다음의 두가지 방법 중 하나를 택하여 진행하면 됨
1) 레이블을 one-hot-encoding 한 후, categorical_crossentropy 손실함수 사용
2) 레이블을 정수로 인코딩 한 후, sparse_categorical_crossentropy 손실함수 사용
실습 ( 직접 값 변경해보기 )
1. 층의 크기 조정
층의 크기를 64에서 128로 늘렸더니 정확도가 1% 향상되었다.
그래서 256으로 더 늘려보았는데 정확도는 동일하였다.
반대로, 층의 크기를 32로 줄였더니 정확도가 3% 떨어졌다.
마지막 출력 클래스의 크기는 46인데 출력 클래스보다 중간층의 크기가 더 작아서
책에 나온 정보 병목 현상이 발생한 것 같다.
2. 층의 개수 조정
기존에는 2개의 은닉층을 사용하였는데, 이를 1개로 줄여보았다.
1개로 줄였을 때에는 정확도가 달라지지 않았다.
그런데, 3개로 늘려보니 정확도가 떨어졌다.
층의 개수가 많다고 좋은 것이 아니라는것을 한번 더 깨닫게 되었다.
<케라스 창시자에게 배우는 딥러닝>(길벗, 2018)을 학습하고 개인 학습용으로 정리한 내용입니다.
'인공지능 > 케라스 창시자에게 배우는 딥러닝' 카테고리의 다른 글
[3. 신경망 시작하기] 이진분류, 다중분류, 회귀 정리 (모델 구성 방법) (0) 2021.01.10 [3. 신경망 시작하기] 3-6. 주택 가격 예측 - 회귀 문제 (0) 2021.01.09 [3. 신경망 시작하기] 3-4. 영화 리뷰 분류 - 이진 분류 예제 (0) 2021.01.09 [2. 신경망의 수학적 구성 요소] 2-4. 그래디언트 기반 최적화 (0) 2021.01.06 [2. 신경망의 수학적 요소] 2-3. 텐서 연산 (0) 2021.01.06 댓글