인공 신경망

Jaeseok Han·2024년 5월 7일

머신러닝&딥러닝

목록 보기
15/22

패션MNIST

1. 데이터 로드 및 전처리

패션 MNIST 데이터셋은 28x28 크기의 회색조 이미지로 구성된 10가지 패션 아이템 분류를 위한 데이터셋이다. 60000개의 훈련 데이터와 10000개의 테스트 데이터로 이루어져 있다.

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

print(train_input.shape, train_target.shape)
#출력 (60000, 28, 28) (60000,)
print(test_input.shape, test_target.shape)
#출력 (10000, 28, 28) (10000,)

2. 데이터 시각화

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()

# 타깃값 확인
print([train_target[i] for i in range(10)])
#출력 [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]

훈련 데이터중 10개의 이미지를 회색조로 시각화한다.

3. 데이터 전처리

#데이터 1차원 배열로 수정
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28) #배열 -1만큼 축소,
print(train_scaled.shape)
#출력 (60000, 784) 784픽셀로 이루러진 각 샘플이 총 60000개
  • 이미지를 1차원 배열로 변경하여 신경망에 입력할 수 있도록 만든다. 28x28 크기의 2차원 배열을 784 길이의 1차원 배열로 변환
  • 데이터를 0과 1사이의 값으로 정규화하여 모델의 안정성을 높인다.

인공 신경망

1. 인공신경망 모델 구축

신경망을 구축할 때, 밀집층(완전 연결층)을 사용하며, 활성화 함수로 softmax를 적용하여 각 클래스에 대한 확률을 출력한다.

# 인공 신경망으로 모델 만들기
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)
print(train_scaled.shape, train_target.shape)
#출력 (48000, 784) (48000,)
print(val_scaled.shape, val_target.shape)
#출력 (12000, 784) (12000,)

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,)) #뉴런 개수, 뉴런의 출력에 적용할 함수, 입력의 크기
# 신경망 모델 생성
model = keras.Sequential(dense)
# 훈련전 설정
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy') 
print(train_target[:10])
#출력 [7 3 5 8 6 9 3 3 9 9] 모두 정수

손실 함수로 sparse_categoriacal_crossentropy를 사용한다. 이는 다중 분류 문제에서 타깃이 정수로 표현된 경우에 적합하다. 정확도(accuracy)를 측정 지표로 사용한다.

3. 이진분류와 다중분류

신경망에서 분류 문제를 해결하는 방식은 주로 이진 분류와 다중 분류로 나뉜다. 패션MNIST데이터셋 10개의 클래스가 있으므로 다중 분류에 해당하지만, 먼저 이진 분류와 다중 분류의 차이와 각각의 손실 함수에 대해 알아본다.

1) 이진 분류

  • 이진 분류에서는 출력층에 하나의 뉴런이 있으며, 이 뉴런이 출력하는 확률 값(a)은 시그모이드(sigmoid)함수를 통해 0과 1 사이의 값으로 변환된다.
  • 이진 크로스 엔트로피 손실은 예측 확률과 타깃값을 사용해 계산된다. 음성 클래스의 확률은 1-a로 구하고, 양성 클래스의 확률은 a이다.

2) 다중 분류

  • 다중 분류에서는 출력층에 여러 개의 뉴런이 있으며, 각 뉴런은 각 클래스에 대한 확률을 출력한다.
  • 소프트맥스(softmax)함수는 각 뉴런의 값을 확률로 변환하여 전체 합이 1이 되도록 만든다.
  • 크로스 엔트로피 손실은 타깃에 해당하는 확률만 남기고 나머지는 0을 곱한다. 예를 들어, 첫 번째 클래스가 타깃이면 나머지 뉴런의 출력은 0을 곱해 0으로 처리된다.

2. 모델 훈련 및 평가

모델을 5 에포크 동안 훈련한다. 훈련 과정에서 손실과 정확도를 출력하며, 훈련된 모델을 통해 성능을 평가한다.

# 모델 훈련
model.fit(train_scaled, train_target, epochs=5)

# 출력
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.5995 - accuracy: 0.7997
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4744 - accuracy: 0.8390
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4495 - accuracy: 0.8472
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4382 - accuracy: 0.8518
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4293 - accuracy: 0.8555
375/375 [==============================] - 1s 2ms/step - loss: 0.4433 - accuracy: 0.8481

# 성능 평가
model.evaluate(val_scaled, val_target)
# [0.443263441324234, 0.8480833172798157]

0개의 댓글