데이터분석-머신러닝-AI/강의 정리

[혼자 공부하는 머신러닝+딥러닝] 17강. 인공 신경망 ▶️ 간단한 인공 신경망 모델 만들기 - 케라스 맛보기

bluebamus 2023. 11. 20.

https://www.youtube.com/watch?v=ZiP9erf5Fo0&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=17

 

1. 패션 MNIST 데이터셋 사용하기

   - 케라스에 내장된 고전 예제 데이터셋을 사용한다.

   - MNIST 데이터는 원래 손으로 0~9를 쓴 이미지이다. 이번 강좌에서 사용하는 데이터는 패션 MNIST이고 10 종류의 이미지 패션 아이템을 가지고 있다.

   - 데이터 가져오기

# 실행마다 동일한 결과를 얻기 위해 케라스에 랜덤 시드를 사용하고 텐서플로 연산을 결정적으로 만듭니다.
import tensorflow as tf

tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()

 

   - 크기 확인

      - 훈련 세트 : 28 * 28 픽셀 이미지의 60000개의 입력 데이터와 0~9의 숫자로 된 60000개의 타깃 값

      - 테스트 세트 : 훈련세트와 동일한 조건의 이미지 10000개, 테스트 타겟은 훈련과 동일

from tensorflow import keras

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape)
(60000, 28, 28) (60000,)

print(test_input.shape, test_target.shape)
(10000, 28, 28) (10000,)

 

   - 데이터 그려보기

      - 타겟을 확인하면 같은 종류아이템은 같은 숫자로 할당되어 있다.

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 10, figsize=(10,10)) # 1행 110열로 배치, 사이즈 설정
for i in range(10):
    axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off') # 이미지만 보기위해 좌표축 제거
plt.show()

print([train_target[i] for i in range(10)])
[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]

 

   - unique()를 사용해 레이블마다 몇개의 샘플들이 있는지 확인하자.

import numpy as np

print(np.unique(train_target, return_counts=True))
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000],
      dtype=int64))

 

   2. 로지스틱 회귀

   - 모델 선택 및 데이터 전처리

      - SGDClassifier를 사용하려면 전처리된 데이터가 필요하다. 

      - 이미지 데이터를 다룰때 표준화를 하지 않고 255로 나누어 0과 1사이의 값으로 만들어 진행해도 문제가 없다.

         - 관례적으로 이러한 방법을 많이 사용 한다.

         - 이번 강의에서 샘플 데이터를 255로 나누어 정규화 하여 사용한다.

      - 손실함수로 로지스틱 손실 함수를 사용한다. 사이킷 런에는 크로스 엔트로피가 없다. 하지만 로지스틱 손실 함수를 선언하면 이진 분류일 경우에는 기본적인 로지스틱 손실함수를 실행하고 다중 분류일 경우 특성 수만큼 이진분류를 실행한다. 반환 값으로 특성 수만큼의 선형 함수의 z 값이 나온다. 이후 소프트맥스를 사용해 확률 값으로 바꾼다.

      - 다진 분류를 여러개의 이진 분류로 나누어 훈련하는 방법을 OVR(One-versus-the-rest), OVA(One-versus-One)라 부른다. 

# 이미지 픽셀값을 255로 나누는 전처리 방법은 정성적이지는 않지만 간편해서 많이 사용한다.
train_scaled = train_input / 255.0 
train_scaled = train_scaled.reshape(-1, 28*28) # SGD 사용을 위해 1차원 샘플 배열로 변경

print(train_scaled.shape)
(60000, 784)

 

   - 모델 훈련

      - 경사하강법을 활용한 로지스틱 회귀모델을 경사하강법 (cross_validate)로 훈련하고 평가한다.

from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier

sc = SGDClassifier(loss='log_loss', max_iter=5, random_state=42)

# 교차검증으로 성능 확인
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1) # 기본 5폴드
print(np.mean(scores['test_score']))
0.8192833333333333 # 정확도

 

   - 로지스틱 회귀 모델

      - 10종류에 대한 레이블에 대해 방정식이 10개가 있다. 그리고 그 결과 값이 z 이다.

      - 각 방정식에대해 설정되는 가중치의 값은 각기 다른 값들이다. 

 

 3. 인공 신경망

   - 입력층

      - 가장 기본적인 형태의 인공신경망은 SGD를 사용하는 로지스틱 회귀와 같다.

      - 입력층은 특별한 계산이 수행되지 않는 말 그대로의 '입력 데이터'이다.

      - 관례상 '입력층'이라 한다.

   - 출력층

      - 신경망의 최종 결과값을 만드는 층

      - 일반적으로 입력층과 출력층 사이에는 많은 층들이 존대한다.

   - 뉴런/유닛

      - z값을 계산하는 단위

   - 출력층이 1개인 경우와 경사하강법을 사용한 선형 로지스틱 회귀와의 결과는 구분이 불가능하다.

 

   - 인공신경망 모델 만들기

      - 딥러닝에서는 교차검증을 잘 사용하지 않는다.

         - 검증 세트를 직접 분리해서 사용한다.

from sklearn.model_selection import train_test_split

# 검증 세트를 수동으로 분리함
train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42)
    
print(train_scaled.shape, train_target.shape)
(48000, 784) (48000,) 

print(val_scaled.shape, val_target.shape) # 20%로 분리함
(12000, 784) (12000,)

 

      - 케라스의 dense() 클래스로 학습하고자 하는 모델의 출력층의 객체를 생성한다.

      - keras.layers : 다양한 층 클래스를 담고 있는 케라스 패키지이다.

         - 패지키 중 가장 기본인 '밀집층'을 사용할 것이다.

            - 모든 입력과 모든 유닛을 선으로 연결하여 빽빽하게 들어차게 된다 때문에 밀집층이라 부른다.

            - 입력층과 출력층이 한번씩 모두 연결이 되어 있기에 '완전연결층(fully connected layer)라고도 부른다.

      - activation : 각 유닛에서 출력되는 z값들을 적용할 활성화 함수를 정의하는 매개변수이다.

         - 만약 이진분류라고 한다면 'activation='sigmoid'로 설정할 수 있다.

      - input_shape : 입력값의 크기를 넣는 매개변수이며 튜플로 정의해야 한다.

# 유닛 10개, 출력에 적용할 함수는 소프트맥스, 입력은 784이다.
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))

 

      - Sequential() : 만들어둔 층 객체로 신경망 모델을 생성해주는 클래스이다. 

         - 순서대로 층을 놓는다는 의미로 차후 강좌에서 더 상세히 언급할 것이다.

model = keras.Sequential(dense)

 

      - 디자인된 딥러닝 모델은 아래 이미지와 같다.

 

 4. 모델 설정

   - 설정 단계

      - 케라스 모델은 훈련하기 전 설정을 해줘야 하는 항목들이 있다.

         - .compile()에서 손실함수, 측정값 등을 설정하면 된다.

# 손실함수는 '크로스 엔트로피' / 정확도도 함께 출력해준다.
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

      - loss : 손실함수의 종류

         - 이진분류 : loss = 'binary_crossentropy' 이진 크로스 앤트로피

         - 다중분류 : loss = 'categorical_crossentropy' 크로스 앤트로피

      - sparse_categorical_crossentropy

         - 다중분류에서 크로스엔트로피 손실함수를 사용하려면 타깃값에 '원-핫 인코딩' 처리를 해줘야 한다. 하지만 이 처리를 정수로 된 타깃값을 그냥 사용하고자 한다면 이 손실함수를 사용하면 된다.

         - 다중 분류에서 이진 분류를 수행할 때 타겟은 양성 확률 1로 나머지는 음성 확률 0으로 만든다. 이것을 '원-핫 인코딩'이라 한다.

      - metrics : 기본적으로 출력되는 '손실 값' 이외 추가로 측정하고 싶은 값

 

   - 훈련 단계

      - .fit()을 사용하고 반복할 횟수는 epoch로 정의한다.

      - 5 에포크만 수행했는데도 로지스틱 모델보다 성능이 좋다. 

print(train_target[:10])
[7 3 5 8 6 9 3 3 9 9]

model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5
1500/1500 [==============================] - 2s 879us/step - loss: 0.6069 - accuracy: 0.7947
Epoch 2/5
1500/1500 [==============================] - 1s 914us/step - loss: 0.4742 - accuracy: 0.8382
Epoch 3/5
1500/1500 [==============================] - 1s 830us/step - loss: 0.4508 - accuracy: 0.8474
Epoch 4/5
1500/1500 [==============================] - 1s 834us/step - loss: 0.4367 - accuracy: 0.8527
Epoch 5/5
1500/1500 [==============================] - 1s 815us/step - loss: 0.4280 - accuracy: 0.8555

  

   - 평가 단계

      - 케라스에서는 .evaluate()로 모델 성능을 평가한다.

         - 사이킷런에서는 .score()를 사용하였다.

         - 이전에 분리 해두었던 검증세트로 성능을 평가한다.

model.evaluate(val_scaled, val_target)
375/375 [==============================] - 0s 802us/step - loss: 0.4526 - accuracy: 0.8465
[0.45262548327445984, 0.8464999794960022]

 

 

   - 사이킷런과 케라스 모델의 사용 방법 차이점 정리

      - 사이킷런

         - 모델을 만들면서 필요한 설정을 매개변수로 대부분 다 정의함, fit 훈련, score 평가

      - 케라스 모델

         - 과정을 세분화하여 호출함

         - 층 객체 만들기, sequential 추가, 모델 설정 compile, fit 훈련, evaluate 평가

 

 - reference :

https://velog.io/@simon919/%ED%98%BC%EA%B3%B5%EB%A8%B8%EC%8B%A0-7-1.-%EC%9D%B8%EA%B3%B5-%EC%8B%A0%EA%B2%BD%EB%A7%9D#%EC%9D%B8%EA%B3%B5%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EC%9C%A0%EB%9E%98

 

[혼공머신] 7-1. 인공 신경망

이번엔 패션 럭키백이다! 홍 선배🗣️ "생선 럭키백에 썼던 로지스틱 회귀 알고리즘보다 정확도를 높일 순 없을까..."

velog.io

 

댓글