본문 바로가기

Newb/머신러닝

[혼공머신] 6주차 [6/6]

반응형

혼공머신도 벌써 마지막 주차!

 

Ch.07 딥러닝을 시작합니다.

패션 럭키백을 판매합니다.

Ch.07-1 인공 신경망

딥러닝과 인공 신경망 알고리즘을 이해하고 케라스를 사용해 간단한 인공 신경망 모델을 만들어 봅시다.

 

마케팅 팀에서 패션 상품의 주 고객층인 20대를 타깃으로 이전보다 럭키백의 정확도를 높여 럭키백 이벤트를 진행하고 싶어한다.

패션 MNIST

MNIST란?
손으로 쓴 숫자(0~9) 이미지 데이터셋으로,
딥러닝에서 가장 기초 실습용으로 많이 사용된다.

 

먼저 사용할 데이터가 필요하므로,

케라스를 사용해 데이터를 불러오자.

(케라스는 딥러닝 모델을 쉽게 만들 수 있게 도와주는 파이썬 라이브러리이다.)

 

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

# 받은 데이터의 크기를 확인
print(train_input.shape, train_target.shape)

# 테스트 세트의 크기 확인
print(test_input.shape, test_target.shape)
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)

 

맷플롯립 라이브러리로 훈련 데이터에서 몇 개의 샘플을 그림으로 출력해 확인해보기

import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 10, figsize=(15, 15))
for i in range(10):
    axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off')
plt.show()
< 샘플 이미지 >

 

위에 출력된 그림은 어떤 레이블에 속해있을까?

슬라이싱 연산자를 이용하여 처음 10개 샘플의 타깃 값을 확인해보자.

print(train_target[:10])
[9 0 0 3 0 2 7 2 5 5]

 

값을 확인해보니 겹치는 데이터들이 있다.

각 값들의 의미는 아래와 같다.

레이블 0 1 2 3 4 5 6 7 8 9
패션 아이템 티셔츠 바지 스웨터 드레스 코트 샌달 셔츠 스니커즈 가방 앵클 부츠

 

각 레이블에는 몇개의 샘플이 들어있을까?

numpy를 이용하여 몇개의 샘플이 들어있는지 확인해보자.

import numpy as np
print(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]))

 

각 각 레이블마다 6,000개의 샘플이 들어있는 것을 확인 할 수 있다.

 

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

위에서 가져온 샘플은 60,000개의 많은 샘플이 있기 때문에,

전체 데이터를 한번에 사용하여 모델을 훈련하는 것 보다는 샘플을 하나씩 꺼내어 모델을 훈련하는 방법이 더 효율적이다.

 

4장에서 배웠던 SGDSClassifier를 이용해보자.

SGDSClassifier이란?
확률적 경사 하강법(Stochastic Gradient Descent, SGD)을 이용해 분류하는 모델

아래와 같은 곳에 많이 사용된다.
 - 텍스트 분류(스팸메일 필터링, 뉴스 카테고리 분류)
 - 이미지 문류(흑백, 컬러 이미지)

 

SGDSClassifier는 2차원 입력을 다루지 못하기 때문에 1차원 배열로 만드는 작업이 필요하다.

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

print(train_scaled.shape)

 

인공 신경망

가장 기본적인 인공 신경망은 확률적 경사 하강법을 사용하는 로지스틱 회귀와 같다.

z_티셔츠, z_바지를 z₁, z₂로 표현하고, 클래스가 총 열개이므로 z₁₀까지 계산하고, 이를 바탕으로 클래스를 예측하기 때문에 신경망의 최종 값을 만든다는 의미로 출력층 이라고 부른다.

 

z 값을 계산하는 단위를 뉴런으로 불렀으나 이제는 뉴런보다는 유닛이라고 부르는 사람들이 더 많아졌다.

 

우리는 구글이 공개한 딥러닝 라이브러리인 텐서플로 라이브러리에 있는 케라스를 사용할 예정이다.

케라스는 직접 GPU 연산을 수행하지는 않지만, GPU 연산을 수행하는 다른 라이브러리르 백엔드로 사용하며,

기본적으로 텐서플로를 백엔드로 사용한다.

import tensorflow as tf
import keras

# 케라스의 기본 백엔드 확인
keras.config.backend()
'tensorflow'

 

인공 신경망으로 모델 만들기

인공신경망(딥러닝)은 데이터가 많고, 학습 시간이 길기 때문에

학습을 여러 번 반복해야 하는 교차 검증은 잘 사용하지 않는 대신,

훈련 세트에서 일부를 떼어서 검증 세트를 사용하여 모델을 조정한다.

 

그럼 훈련 세트에서 20%만 덜어내어 검증 세트를 만들어 보자.

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)

print(train_scaled.shape , train_target.shape)
print(val_scaled.shape, val_target.shape)

# 입력층 정의
inputs = keras.layers.Input(shape=(784,))

# 밀집층 (뉴런 개수, 뉴런의 출력에 적용할 함수)
dense = keras.layers.Dense(10, activation='softmax')

model = keras.Sequential([inputs, dense])

model.summary()
(38400, 784) (38400,) (9600, 784) (9600,)
Model: "sequential"
┏━━━━━━━┳━━━━━━━┳━━━━━┓
┃ Layer (type)     ┃ Output Shape ┃ Param #  ┃
┡━━━━━━━╇━━━━━━━╇━━━━━┩
 │ dense (Dense)   │ (None, 10)          │ 7,850.          │
└───────┴───────┴─────┘
Total params: 7,850 (30.66 KB)
Trainable params: 7,850 (30.66 KB)
Non-trainable params: 0 (0.00 B)

 

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

케라스 모델은 훈련하기 전에 아래와 같이 설정 단계가 필요하다.

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5 1200/1200 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.7198 - loss: 0.8169 Epoch 2/5 1200/1200 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.8304 - loss: 0.4997 Epoch 3/5 1200/1200 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.8405 - loss: 0.4663 Epoch 4/5 1200/1200 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.8482 - loss: 0.4438 Epoch 5/5 1200/1200 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.8538 - loss: 0.4375
<keras.src.callbacks.history.History at 0x7b34c34acc90>

이진 분류 : loss = binary_crossentropy

다중 분류 : loss = categorical_crossentropy

 

확인 문제

1. 어떤 인공 신경망의 입력 특성이 100개이고 밀집층에 있는 뉴런 개수가 10개일 때 필요한 모델 파라미터의 개수는 몇 개 인가요?

밀집층에 있는 10개의 뉴런이 100개의 입력이 있으니 100x10=1000개의 가중치에, 1개의 절편이 있으므로 1010개

 

2. 케라스의 Dense 클래스를 사용해 신경망의 출력층을 만들려고 합니다. 이 신경망이 이진 분류 모델이라면 activation 매개변수에 어떤 활성화 함수를 지정해야 하나요?

이진 분류의 경우 출력 노드가 1개이기 때문에 결과값을 0~1 사이 확률로 만들기 위해 sigmoid 함수를 사용

 

3. 케라스 모델에서 손실 함수와 측정 지표 등을 지정하는 메서드는 무엇인가요?

케라스 모델은 학습 전에 설정이 필요한데 설정은 complie() 메서드로 가능

 

4. 정수 레이블을 타깃으로 가지는 다중 분류 문제일 때 케라스 모델의 complie() 메서드에 지정할 손실 함수로 적절한 것은 무엇인가요? 

다중 분류 일 경우 원-핫 인코딩을 안하기 때문에 sparse_categorical_crossentropy로 지정

 

 

반응형

'Newb > 머신러닝' 카테고리의 다른 글

[혼공머신] 5주차 [5/6]  (13) 2025.08.09
[혼공머신] 4주차 [4/6]  (3) 2025.07.27
[혼공머신] 3주차[3/6]  (1) 2025.07.20
[혼공머신] 2주차  (11) 2025.07.13
[혼공머신] 1주차  (2) 2025.07.06