본문 바로가기

머신러닝/딥러닝

인공신경망(훈련모델생성)(1)

텐서플로의 케라스 패키지를 임포트

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