딥러닝

[DL]4. 다중분류

CodeJaram 2023. 9. 14. 17:42

딥러닝_04_다중분류

 

  1. 다중분류: 분류되는 클래스의 개수가 3개 이상인 분류
  2. 활성화 함수: 신호를 활성화 함수를 거쳐 역치 이상의 자극만 다음 계층의 전달함
  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'

 

[손글씨 데이터 분류]

  1. 목표
  • 손글씨 데이터를 분류(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