딥러닝 기초 | 인공신경망 모델 만들기 | 텐서플로(Tensorflow) / 케라스(Keras) | 로지스틱 회귀로 패션 아이템 분류하기(SGDClassifier 클래스_확률적 경사 하강법) | 패션 MNIST 데이터셋

728x90

 

1. 패션 MNIST 데이터 가져오기

 

▶ 패션 MNIST 데이터 

: 10종류의 패션 아이템으로 구성

: MNIST 데이터는 워낙 유명하기 때문에 많은 딥러닝 라이브러리에서 이 데이터를 가져옴

: 텐서플로를 사용해 이 데이터를 읽어옴

: 텐서플로의 케라스(Keras) 패키지를 임포트하고 패션 MNIST 데이터를 사용

 

▶ 텐서플로 케라스(Keras) 패키지 가져오기

from tensorflow import keras

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

: 실행마다 동일한 결과를 얻기 위해 케라스 랜덤 시드를 사용, 텐서플로 연산을 결정적으로 만듦

: Keras.datasets.fashion.mnist 모듈 아래 load_data() 함수는 친절하게 훈련 데이터와 테스트 데이터를 나누어 반환

: 데이터는 각각 입력과 타깃의 쌍으로 구성

 

▶ 전달받은 데이터의 크기 확인

 

* 훈련 데이터 크기

print(train_input.shape, train_target.shape)

>> 훈련 데이터는 60,000개의 이미지로 이루어짐

>> 각 이미지는 28x28 크기, 타깃도 60,000개의 원소가 1차원 배열

 

* 테스트 데이터 크기

print(test_input.shape, test_target.shape)

>> 테스트 데이터는 10,000개의 이미지로 이루어짐

>> 각 이미지는 28x28 크기, 타깃도 10,000개의 원소가 1차원 배열

 

▶ 훈련데이터에서 몇 개의 샘플을 그림으로 출력해보기

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
    axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off')
plt.show()

>> 신발과 다양한 종류의 옷이 보임

>> 이미지인지는 직접 보는 것이 문제를 이해하는 데 도움이 됨

>> 크기가 28x28이다 보니 꽤 작고 흐릿함. 흑백 이미지

 

▶ 파이썬 리스트로 처음 10개의 샘플 타깃값 출력하기

: 처음 10개의 샘플의 타깃값을 리스트로 만든 후 출력

print([train_target[i] for i in range(10)])

 

▶ 중복 제거하고 타깃값 출력하기  

import numpy as np

print(np.unique(train_target, return_counts=True))

 


2. 로지스틱 회귀로 패션 아이템 분류하기

 

▶ 2차원 배열을 1차원 배열로 바꾸기

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)

: reshape() 메서드의 두 번째 매개변수를 이미지 크기에 맞게 지정하면(28x28)

첫 번째 차원(샘플 개수)은 변하지 않고, 원본 데이터의 두 번째, 세 번째 차원이 1차원으로 합쳐짐

 

▶ 변환된 train_scaled 크기 확인

print(train_scaled.shape)

>> 784 픽셀로 이루어진 60,000개의 샘플이 준비됨

 

▶ SGDClassifier 클래스, cross_validate 함수 

: 훈련 샘플이 60,000개나 되는데 전체 데이터를 한 번에 사용하여 모델을 훈련하기는 어려움

확률적 경사 하강법(SGDClassifier)은 샘플을 하나씩 꺼내어 모델을 훈련하는 방법에 효과적임

:  SGDClassifier 클래스, cross_validate 함수로 데이터를 교차 검증 해서 모델을 평가함

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

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

scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))

 


3. 인공신경망 활용

 

3-1) 인공신경망_텐서플로와 케라스

 

▶ 인공신경망

: 인공신경망은 확률적 경사 하강법을 사용하는 로지스틱 회귀와 같음

: 패션아이템 분류 문제를 인공신경망으로 표현

 

▶ 텐서플로와 케라스 가져오기

import tensorflow as tf
from tensorflow import keras

: 텐서플로는 구글의 딥러닝 라이브러리(코랩에는 텐서플로가 설치되어 있기 때문에 임포트하여 사용 가능)

: 텐서플로에는 저수준 API와 고수준 API가 있는데 케라스는 고수준 API임

: 딥러닝 라이브러리가 달든 머신러닝 라이브러리와 다른 점 중 하나는 그래픽 처리 장치인 GPU를 사용해 인공신경망을 훈련한다는 점

: GPU는 벡터와 행렬 연산에 매우 최적화되어 있어 곱셈과 덧셈이 많이 수행되는 인공신경망에 큰 도움이 됨

 

3-2) 인공신경망으로 모델 만들기

 

▶ 훈련세트와 검증세트 만들기

: 로지스틱 회귀에서는 교차 검증을 사용해 모델을 평가하지만 인공신경망에서는 교차검증을 잘 사용하지 않고, 검증세트를 별도로 구성하여 사용

: 딥러닝 분야의 데이터셋은 충분히 커서 검증 점수가 안정적이지만 교차 검증을 수행하기에는 훈련 시간이 오래 걸림

: 딥러닝 모델은 훈련하는 데에 몇 시간, 며칠이 걸리기도 함

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)

: 패션 MNIST 데이터셋은 그만큼 많지는 않지만 관례를 따라 검증세트로 나누어 진행

 

▶ 훈련세트와 검증세트 크기 확인

 

* 훈련세트 크기

print(train_scaled.shape, train_target.shape)

>> 훈련세트의 20%를 검증세트로 나눔

 

* 검증세트 크기

print(val_scaled.shape, val_target.shape)

>> 60,000개 중에 12,000개가 검증세트로 분리

 

dense 클래스로 밀집층 만들기

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))

: 필요한 매개변수는 뉴런 개수(10개), 뉴런의 출력에 적용할 수 있는 함수(softmax), 입력의 크기(784)

 

밀집층을 가진 신경망 모델 만들기

: 케라스의 Sequential 클래스 사용

model = keras.Sequential(dense)

 


4. 인공신경망으로 패션 아이템 분류하기

 

▶ 케라스 모델 훈련하기 전 설정 단계

: 이런 설정을 model 객체compile() 메서드에서 수행

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

 

▶ train_target 10개 출력해보기

print(train_target[:10])

 

▶ 모델 훈련_fit() 메서드 사용

: 훈련하는 fit() 메서드는 사이킷런과 매우 비슷

: 두 매개변수에 입력(train_scaled), 타깃(train_target) 입력

: epochs = 매개변수로 반복할 에포크 횟수를 지정 

model.fit(train_scaled, train_target, epochs=5)

 

▶ 모델 훈련_evaluate() 메서드 사용

: evaluate() 메서드도 fit() 메서드와 비슷한 출력을 보여줌

model.evaluate(val_scaled, val_target)

>> 검증세트의 점수는 훈련세트의 점수보다 조금 낮은 것이 일반적

>> 예상대로 평가 결과는 훈련세트의 점수보다 조금 낮은 85% 정도의 정확도를 반환

>> 패션 아이템을 분류하는 모델을 잘 훈련함

728x90

댓글