딥러닝_04_다중분류
- 다중분류: 분류되는 클래스의 개수가 3개 이상인 분류
- 활성화 함수: 신호를 활성화 함수를 거쳐 역치 이상의 자극만 다음 계층의 전달함
- 활성화 함수의 종류: 예측하고 싶은 데이터의 따라 출력층의 활성화 함수가 달라짐
1)연속형 데이터(회귀): Linear 함수(항등함수), y=x
-입력값 그대로 출력되지만 활성화 함수를 입력해야 하기 때문에 형식적으로 있는 것
-활성화 함수를 따로 작성하지 않으면 기본값으로 Linear 함수가 적용됨
2)분류: 선형모델의 출력결과는 연속형 데이터, 분류모델의 출력결과는 확률이므로 활성화 함수를 통해 연속형 데이터를 확률로 변환
- 초기 활성화 함수: step function, 기울기가 없어 경사하강법과 맞지 않음
- 이진분류: sigmoid 함수, 한 클래스의 확률
-하나의 출력된 값이 0~1 사이의 확률로 출력
- 다중분류: softmax 함수, 각 클래스별 확률 계산(클래스별 확률 총합: 100%)
-클래스의 개수만큼 0~1 사이의 확률로 출력
-클래스 중 확률이 가장 높은 클래스를 정답으로 채택
-출력층의 퍼셉트론의 수는 클래스의 개수만큼 작성
.4 모델 학습방법 손실함수 설정
1)회귀: mse(mean_squared_error)
2)분류: crossentropy
- 이진분류: binary_crossentropy
- 다중분류: categorical_crossentropy
5. 다중분류 정답데이터의 크기와 실제정답 데이터 맞추기
- 정답데이터를 확률로 변환: to_categorical
-one-hot-encoding과 비슷한 방식
-해당하는 클래스 확률은 1, 나머지 클래스의 확률은 0으로 표시
- 2.keras에서 제공하는 자동방식
-loss: 'sparse_categorical_crossentropy'
[손글씨 데이터 분류]
- 목표
- 손글씨 데이터를 분류(0~9)하는 딥러닝 모델 설계
- 다중분류 딥러닝 모델링 연습
#필요한 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2. 데이터 불러오기
#손글씨 데이터 불러오기(keras 제공)
from tensorflow.keras.datasets import mnist
#학습용/테스트용 데이터, 문제/정답데이터 구분된 상태
(X_train, y_train), (X_test, y_test)=mnist.load_data()
3. 데이터 확인
- 학습용 데이터 확인
#학습용 데이터의 크기 확인
print(X_train.shape, y_train.shape)
#문제데이터->3차원
#데이터의 개수->60000
#픽셀의 개수(입력특성)->28*28
- 테스트용 데이터 확인
#테스트용 데이터의 크기 확인
print(X_test.shape, y_test.shape)
#데이터의 개수->10000
- 클래스의 개수 확인
#클래스의 개수 확인
np.unique(y_train)
#0~9(10개)->다중 분류
- 사진 데이터의 확인
#사진 데이터 확인
plt.imshow(X_train[1000], cmap='gray')
#흑백사진
#픽셀(28*28): 사진의 정보를 담은 단위
#1픽셀은 1개의 숫자데이터(0~255)를 가짐
#0: 검은색, 255: 흰색
4. 모델링
from tensorflow.keras.models import Sequential #뼈대
from tensorflow.keras.layers import Dense, InputLayer, Flatten #층
1)신경망 모델 구조 설계
#1. 신경망 모델 구조 설계
#1. 뼈대
digit_model=Sequential()
#2. 입력층
#사진 1장의 크기: 28*28
#2차원 데이터
digit_model.add(InputLayer(input_shape=(28,28 )))
#3. 중간층
digit_model.add(Flatten()) #2차원 데이터를 1차원 데이터로 변경(선형모델)
digit_model.add(Dense(units=16, activation='sigmoid'))
digit_model.add(Dense(units=8, activation='sigmoid'))
#4. 출력층
#각 클래스별 확률 출력(클래스별 확률 총합: 100%)
digit_model.add(Dense(units=10, activation='softmax'))
※활성화 함수
- 중간층: 학습능력의 결과를 향상시키기 위함(sigmoid)
- 출력층: 예측결과에 따라 다른 활성화 함수 설정(패턴 지정되어 있음)
-회귀: linear(항등 함수), y=x(선형모델이 예측한 결과 그대로 전달)
-이진분류: sigmoid(0~1 사이의 값->확률)
-다중분류: softmax(클래스의 개수만큼 0~1 사이의 값->클래스별 확률(총합 1))
2)모델 학습 및 평가방법 설정
#모델 학습 및 평가방법 설정
#loss: 학습하는 과정에서 모델의 오차 확인
#회귀: mse(mean_squared_error)
#분류: crossentropy
##이진분류: binary_crossentropy
##다중분류: categorical_crossentropy
digit_model.compile(loss='categorical_crossentropy',
optimizer='SGD',
metrics=['accuracy']
)
3)모델 학습 및 학습결과 시각화
#모델 학습 및 결과 시각화
# digit_model.fit(X_train, y_train,
# validation_split=0.2,
# epochs=20)
#예측결과와 실제결과의 데이터의 크기가 맞지 않음
# 실제 데이터의 출력결과->Shapes (32, 1)
# 모델의 출력결과(클래스별 확률)->(32, 10)
※예측결과와 실제결과값을 비교할 수 있는 방법
1)정답데이터를 확률로 변환: to_categorical
-one-hot-encoding과 비슷한 방식
-해당하는 클래스 확률은 1, 나머지 클래스의 확률은 0으로 표시
2)keras에서 제공하는 자동방식
-loss: 'sparse_categorical_crossentropy'
①학습용 정답데이터를 확률로 변환: to_categorical
# 범주형 데이터를 확률값으로 변경하는 도구
from tensorflow.keras.utils import to_categorical
y_train_onehot=to_categorical(y_train)
#모델 학습 및 결과 시각화
digit_model.fit(X_train, y_train_onehot, validation_split=0.2,
epochs=20)
②keras에서 제공하는 자동방식: loss: 'sparse_categorical_crossentropy'
#모델 학습방법 및 평가방법 설정
digit_model.compile(loss='sparse_categorical_crossentropy',
optimizer='SGD',
metrics=['accuracy']
)
#모델 학습
h1=digit_model.fit(X_train, y_train, validation_split=0.2,
epochs=20)
#학습결과 시각화
plt.figure(figsize=(10,5))
plt.plot(h1.history['loss'], label='train_loss')
plt.plot(h1.history['val_loss'], label='val_loss')
plt.legend()
plt.show()
4)모델 평가
#모델 평가
digit_model.evaluate(X_test, y_test)
#정확도(accuracy): 0.8215
'딥러닝' 카테고리의 다른 글
[DL]6. CNN (0) | 2023.09.20 |
---|---|
[DL]5. 오차 역전파 (0) | 2023.09.15 |
[DL]3. 퍼셉트론, 다층퍼셉트론 (0) | 2023.09.11 |
[DL]2. 딥러닝 개요 (0) | 2023.09.09 |
[DL]1. 텍스트 마이닝 (0) | 2023.09.06 |