텐서플로의 케라스 패키지를 임포트
from tensorflow import keras
패션 MNIST 데이터 다운
keras.datasets.fashion_mnist.load_data()
load_data() 함수는 훈련 데이터와 테스트 데이터를 나누어 반환해줌
(train_input, train_target), (test_input, test_target) =\
keras.datasets.fashion_mnist.load_data()
훈련 데이터는 60,000개의 이미지로 이루어져 있습니다.
각 이미지는 28*28 크기입니다.
타겟도 60,000개의 원소가 있는 1차원 배열입니다.
테스트 세트는 10,000개의 이미지로 이루어져 있습니다.
이미지 샘플 그리기
import matplotlib.pyplot as plt
### 큰 그래프 안에 작은 공간 10개 만들기(1행 10열)
fit, axs = plt.subplots(1, 10, figsize=(10,10))
### 10개만 추출해서 그려보기
for i in range(10):
### 작은 공간에 이미지 10개를 각각 보여주기
axs[i].imshow(train_input[i], cmap="gray_r")
### 그래프의 x축과 y축 보여주지 않기 설정
axs[i].axis("off")
### 그래프 그리기
plt.show()
처음 10개 샘플의 타깃값 출력
### target 데이터 10개 출력하기
[train_target[i] for i in range(10)]
[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
레이블 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
패션 아이템 | 티셔츠 | 바지 | 스웨터 | 드레스 | 코트 | 샌달 | 셔츠 | 스니커즈 | 가방 | 앵클부츠 |
레이블당 샘플 갯수 확인 : np.unique()
### 전체 데이터별 target 데이터 확인하기
import numpy as np
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]))
0~9 까지 레이블마다 6,000개의 샘플이 들어 있습니다.
train_input[0]
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1,
1, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0,
0, 3],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12,
10, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130,
72, 15],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88,
172, 66],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196,
229, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245,
173, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243,
202, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12,
219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197,
209, 52],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99,
244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119,
167, 56],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55,
236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209,
92, 0],
[ 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237,
226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255,
77, 0],
[ 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228,
207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244,
159, 0],
[ 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217,
226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238,
215, 0],
[ 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200,
159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232,
246, 0],
[ 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240,
80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228,
225, 0],
[ 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217,
241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224,
229, 29],
[ 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198,
213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221,
230, 67],
[ 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219,
221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205,
206, 115],
[ 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211,
210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177,
210, 92],
[ 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189,
188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216,
170, 0],
[ 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244,
221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0]], dtype=uint8)
픽셀 데이터는 0~255 사이의 값으로 구성되어 있습니다.
분류모델을 이용해서 분류하기(로지스틱)
훈련 샘플은 60,000개나 되기 때문에 전체 데이터를 한꺼번에 사용하여 모델을 훈련하는 것보돠 샘플을 하나씩 꺼내서 모델을 훈련하는 방법이 더 효율적입니다.
확률적 경사 하강법
SGDClassifier 클래스의 loss 매개변수를 'log'로 지정하여 로지스틱 손실 함수를 최소화하는 모델입니다.
표준화 전처리된 데이터를 사용합니다.
여러 특성 중 기울기가 가장 가파른 방향을 따라 이동합니다.
2차원 입력을 다루지 못하기 때문에 1차원 배열로 만들어야 합니다.
### 1. 정규화 처리하기..
### 이미지 데이터 훈련 시 전처리 (정규화 작업을 수행)
# 0~1 사이의 값으로 정규화 시키기
# 산술식 = 독립변수 / 255.0
train_scaled = train_input / 255.0
train_scaled[0]
train_scaled.shape
(60000, 28, 28)
### 2. 차원 축소하기...
# - 훈련을 하기 위해서는 2차원 데이터로 만들어야 함
# - 이후 이미지로 보고자 할때는 3차원으로 만든 후 시각화
# - 필셀 데이터 2차원을 1차원 수평적 필셀데이터로 변환하기
# - 행의 갯수 6만개, 1차원(28 * 28) 784개 데이터
train_scaled = train_scaled.reshape(-1, 28 * 28)
train_scaled.shape
(60000, 784)
<SGDClassifier(확률적경사하강법) 모델> 사용
- 딥러닝에서 사용하는 기본 알고리즘
- 경사하강법에 의해 딥러닝 라이브러리들이 계속해서 만들어짐
- 정규화된 선형분류모델로 계산값을 기반으로
0보다 작으면 -1, 0보다 크면 1로 분류하는 이진분류 사용
- 사람이 개입하지 않고 모델이 알아서 계산하게 됨
이미지 데이터 분류하기 (로지스틱 회귀모델 사용)
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
### 모델(클래스) 생성하기
# - loss(손실함수) : log(logistic regreession 알고리즘)
# -> 예측값과 정답이 얼마나 차이가 나는지를 나타내는 값(손실계수)
# -> 목적지에 다다를때까지 손실을 줄여 가면서 경사를 내려가게됨
# - max_iter : 훈련 반복 횟수(default는 1000번)
sc = SGDClassifier(loss = "log",
max_iter=5, random_state=42)
sc
### 교차검증 방식으로 검증결과 확인하기
# - n_job : 시스템에서 사용할 CPU 코어(core)의 갯수 지정
# : -1은 모든 코어 사용 (병렬 연산을 수행함)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
### 교차검증 정확도 확인하기
np.mean(scores["test_score"])
0.8192833333333333
'머신러닝 > 딥러닝' 카테고리의 다른 글
인공신경망(훈련모델생성)(2) (0) | 2024.03.20 |
---|---|
가상환경설치 (0) | 2024.03.18 |