패션 MNIST
아래와 같이 텐서플로의 케라스 패키지를 임포트하고 패션 MNIST를 불러온다.
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개의 이미지로 이루어져 있으며 각 이미지가 28 * 28 크기인 것과 타깃이 60,000개의 원소가 있는 1차원 배열임을 알 수 있다.
print(test_input.shape, test_target.shape)
훈련 데이터에서 몇 개의 샘플을 그림으로 출력하기 위한 코드는 아래와 같다.
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()
패션 MNIST의 타깃은 0~9까지의 숫자 레이블로 구성된다.
아래 코드를 통해 0~9 레이블에 6,000개의 샘플이 들어 있는 것을 확인할 수 있다.
import numpy as np
print(np.unique(train_target, return_counts = True))
로지스틱 회귀로 패션 아이템 분류하기
SGDClassifier는 2차원 입력을 다루지 못하기 때문에 각 샘플을 1차원 배열로 만들어야한다.
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28 * 28)
print(train_scaled.shape)
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']))
SGDClassifier의 반복횟수(max_iter)를 늘려도 성능이 크게 향상되지 않는다.
인공 신경망
위 그림에서의 output은 총 두개로 신경망의 최종 값을 만든다는 의미에서 출력층이라고 일컫는다.
출력층의 값을 계산하는 단위를 뉴런(neuron)이라고 부르며 뉴런이란 표현 대신 유닛(unit)이라고 부르는 경우도 존재한다.
input 으로 작성된 3개의 유닛들을 통틀어 입력층이라고 부른다. 입력층은 픽셀값 자체이고 특별한 계산을 수행하지 않는다.
인공 신경망은 기존의 머신러닝 알고리즘이 잘 해결하지 못했던 문제에서 높은 성능을 발휘하는 새로운 종류의 머신러닝 알고리즘이다.
텐서플로와 케라스
텐서플로는 구글이 2015년 11월 오픈소스로 공개한 딥러닝 라이브러리이다.
코랩에는 이미 텐서플로가 설치되어 있기 때문에 다음처럼 간단히 임포트하여 사용할 수 있다.
import tensorflow as tf
텐서플로에는 저수준 API와 고수준 API가 있으며 케라스(Keras)가 텐서플로의 고수준 API이다.
딥러닝 라이브러리는 그래픽 처리 장치인 GPU를 사용하여 인공 신경망을 훈련한다는 점에서 다른 머신러닝 라이브러리와의 차이점을 갖는다. GPU는 벡터와 행렬 연산에 매우 최적화되어 있기 때문에 곱셈과 덧셈이 많이 수행되는 인공 신경망에 큰 도움이 된다.
케라스 라이브러리는 직접 GPU 연산을 수행하지 않는다. 대신 GPU 연산을 수행하는 다른 라이브러리를 백엔드로 사용한다.
텐서플로에서 케라스를 사용하려면 다음과 같이 임포트해야 한다.
from tensorflow import keras
인공 신경망으로 모델 만들기
인공 신경망에서는 교차 검증을 잘 사용하지 않고 검증 세트를 별도로 덜어내어 사용한다.
딥러닝 분야의 데이터셋은 충분히 크기 때문에 검증 점수가 안정적이고, 교차 검증을 수행하기에는 훈련 시간이 너무 오래 걸리기 때문이다.
위와 같은 이유로 검증 세트를 나누는 코드를 수행한다.
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)
훈련 세트에서 20%를 검증 세트로 덜어 내었다.
print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)
60,000개 중에 12,000개가 검증 세트로 분리되었다.
훈련 세트로 모델을 생성한 후 검증 세트로 훈련한 모델을 평가하는 과정을 수행한다.
케라스의 레이어(keras.layers) 패키지 안에는 다양한 층이 준비되어 있다. 가장 기본이 되는 층은 밀집층(dense layer)이다.
밀집층은 양쪽의 뉴런이 모두 연결하고 있기 때문에 완전 연결층(fully connected layer)이라고도 부른다.
케라스의 Dense 클래스를 사용해 밀집층을 만들 수 있다.
필요한 매개변수는 뉴런 개수, 뉴런의 출력에 적용할 함수, 입력의 크기이다.
dense = keras.layers.Dense(10, activation = 'softmax', input_shape = (784,))
케라스의 Sequential 클래스를 사용하여 밀집층을 가진 신경망 모델을 만들 수 있다.
model = keras.Sequential(dense)
인공 신경망으로 패션 아이템 분류하기
케라스 모델은 훈련하기 전에 설정 단계가 존재한다. 이런 설정을 model 객체의 compile()메서드에서 수행한다. 꼭 지정해야 하는 것은 손실 함수의 종류이다. 그다음 훈련 과정에서 계산하고 싶은 측정값을 지정한다.
model.compile(loss = 'sparse_categorical_crossentropy', metrics = 'accuracy')
케라스는 두 손실 함수를 각각 아래와 같이 칭한다.
이진 분류 : loss = 'binary_crossentropy'
다중 분류 : loss = 'categorical_crossentropy'
원-핫 인코딩(one-hot encoding)은 타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 것을 의미한다.
텐서플로에서는 정수로 된 타깃값을 원-핫 인코딩으로 바꾸지 않고 그냥 사용이 가능하다. 정수로된 타깃값을 사용해 크로스 엔트로피 손실을 계산하는 것이 바로 'sparse_categorical_crossentropy'이다.
이 때 만약 타깃값을 원-핫 인코딩으로 준비했다면 compile() 메서드에 손실 함수를 loss = 'categorical_crossentropy'로 지정하면 된다.
케라스는 모델이 훈련할 때 기본으로 에포크마다 손실 값을 출력해 준다. 손실이 줄어드는 것을 보고 훈련이 잘되었다는 것을 알 수 있지만 정확도를 함께 출력하고 싶을 때 metrics매개변수에 정확도 지표를 의미하는 'accuracy'를 지정할 수 있다.
fit() 메서드는 사이킷런과 매우 비슷하다. 두 매개 변수에 입력, 타깃을 지정한 후 그다음 반복할 에포크 횟수를 epochs 매개변수로 지정한다.
model.fit(train_scaled, train_target, epochs = 5)
케라스에서 모델의 성능을 평가하는 메서드는 evaluate()이다.
evaluate() 메서드도 fit() 메서드와 비슷한 출력을 보인다.
model.evaluate(val_scaled, val_target)
'AI > 혼자공부하는머신러닝딥러닝' 카테고리의 다른 글
[DL] 07-3 신경망 모델 훈련 (0) | 2024.02.22 |
---|---|
[DL] 07-2 심층 신경망 (0) | 2024.02.21 |
[ML] 06-3 주성분 분석 (1) | 2024.01.26 |
[ML] 06-2 k-평균 (1) | 2024.01.23 |
[ML] 06-1 군집 알고리즘 (1) | 2024.01.23 |