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% 정도의 정확도를 반환
>> 패션 아이템을 분류하는 모델을 잘 훈련함
댓글