본문 바로가기
AI/혼공머신

[혼공머신] 07-1 | 인공신경망

by 뒹굴거리는프로도 2024. 11. 15.
반응형

 


https://youtu.be/ZiP9erf5Fo0?si=GdjYvbKcXo7UxqIB


 

 

키워드


인공 신경망

인공 신경망은 생물학적 뉴런에서 영감을 받아 만든 머신러닝 알고리즘입니다. 이름이 신경망이지만 실제 우리 뇌를 리모델링한 것은 아닙니다. 신경망은 기존의 머신러닝 알고리즘으로 다루기 어려웠던 이미지, 음성, 텍스트 분야에서 뛰어난 성능을 발휘하면서 크게 주목받고 있습니다. 인공 신경망 알고리즘을 종종 딥러닝이라고도 부릅니다.

텐서플로

텐서플로는 구글이 만든 딥러닝 라이브러리로 매우 인기가 높습니다. CPU와 GPU를 사용해 인공 신경망 모델을 효율적으로 훈련하며, 모델 구축과 서비스에 필요한 다양한 도구를 제공합니다. 텐서플로 2.0부터는 신경망 모델을 빠르게 구성할 수 있는 케라스를 핵심 API로 채택하였습니다. 케라스를 사용하면 간단한 모델에서 아주 복잡한 모델까지 손쉽게 만들 수 있습니다.

밀집층

밀집층은 가장 간단한 인공 신경망의 층입니다. 인공 신경망에는 여러 종류의 층이 있습니다. 밀집층에서는 뉴런들이 모두 연결되어 있기 때문에 완전 연결 층이라고도 부릅니다. 특별히 출력층에 밀집층을 사용할 때는 분류하려는 클래스와 동일한 개수의 뉴런을 사용합니다.

원-핫 인코딩

정숫값을 배열에서 해당 정수 위치의 원소만 1이고 나머지는 모두 0으로 변환합니다. 이런 변환이 필요한 이유는 다중 분류에서 출력층에서 만든 확률과 크로스 엔트로피 손실을 계산하기 위해서 입니다. 텐서플로에는 'sparse_categorical_entropy' 손실을 지정하면 이런 변환을 수행할 필요가 없습니다.


핵심 패키지와 함수


TensorFlow

​*Dense

Dense는 신경망에서 가장 기본 층인 밀집층을 만드는 클래스입니다.
이 층의 첫 번째 매개변수에는 뉴런의 개수를 지정합니다.
activation 매개변수에는 사용할 활성화 함수를 지정합니다. 대표적으로 'sigmoid', 'softmax' 함수가 있습니다. 아무것도 지정하지 않으면 활성화 함수를 사용하지 않습니다.
케라스의 Sequential클래스에 맨 처음 추가되는 층에는 input_shape 매개변수로 입력의 크기를 지정해야 합니다.
*Sequential

Sequential은 케라스에서 신경망 모델을 만드는 클래스입니다.
이 클래스의 객체를 생성할 때 신경망 모델에 추가할 층을 지정할 수 있습니다. 추가할 층이 1개 이상일 경우 파이썬 리스트로 전달합니다.
*compile()

compile()은 모델 객체를 만든 후 훈련하기 전에 사용할 손실 함수와 측정 지표 등을 지정하는 메서드입니다.
loss 매개변수에 손실 함수를 지정합니다. 이진 분류일 경우 'binary_crossentropy', 다중 분류일 경우 'categorical_crossentropy'를 지정합니다. 클래스 레이블이 정수일 경우 'sparse_categorical_crossentropy'로 지정합니다. 회귀 모델일 경우 'mean_square_error'등으로 지정할 수 있습니다.
metrics 매개변수에 훈련 과정에서 측정하고 싶은 지표를 지정할 수 있습니다. 측정 지표가 1개 이상일 경우 리스트로 전달합니다.
*fit()

fit()은 모델을 훈련하는 메서드입니다.
첫 번째와 두 번째 매개변수에 입력과 타깃 데이터를 전달합니다.
epochs 매개변수에 전체 데이터에 대해 반복할 에포크 횟수를 지정합니다.
*evaluate()

evaluate()는 모델 성능을 평가하는 메서드입니다.
첫 번째와 두 번째 매개변수에 입력과 타깃 데이터를 전달합니다.
compile() 메서드에서 loss 매개변수에 지정한 손실 함수의 값과 metrics 매개변수에서 지정한 측정 지표를 출력합니다.


07-1 단원 내용


시작하기 전에

패션 상품의 주 고객층인 20대를 타깃으로 하니, 럭키백의 정확도를 이전보다 높여보자.

패션 MNIST

패션 MNIST 데이터는 워낙 유명하기 때문에 많은 딥러닝 라이브러리에서 사용한다. 여기서는 텐서플로TensorFlow를 사용해 데이터를 불러오자.

from tensorflow import keras 

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

print(train_input.shape, train_tartget.shape) 

# 결과 -> (60000, 28, 28), (60000,)

 

6장에서 맷플롯립 라이브러리로 과일을 출력했던 것처럼, 훈련 데이터에서 몇 개의 샘플을 그림으로 그려보자.

 
import matplotlib.pyplot import 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()

 

파이썬의 리스트 내포를 사용해서 처음 10개 샘플의 타깃값을 리스트로 만든 후 출력해보자.

 
print( [train_target[i] for i in range(10)] ) 
# 결과 -> [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]

 

레이블 당 샘플 개수를 확인해보자.

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

-> 0~9까지 레이블마다 정확히 6,000개의 샘플이 들어 있는 것을 볼 수 있다.
"""
 

 

 

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

훈련 샘플이 60,000개나 되기 때문에 샘플을 하나씩 꺼내 모델을 훈련하는 것이 효율적이다. 4장에서 배운 SGDClassifier를 사용해보자.

패션 MNIST의 경우 각 픽셀은 0~255 사이의 정숫값을 가진다. 255로 나누어 0~1사이의 값으로 정규화하자. 그리고 6장에서 했듯이 reshape() 메서드를 사용해 2차원 배열인 각 샘플을 1차원 배열로 바꾸자.

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

print(train_scaled.shape) 

# (60000, 784)
 

 

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(scored['test_score']) ) 
# 0.89...
 

 

인공 신경망

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

[텐서플로와 케라스]

케라스Keras는 텐서플로의 고수준 API이다. 이 라이브러리는 직접 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) 

print(train_scaled.shape, train_target.shape) 
# (48000, 784) (48000, )

print(val_scaled.shape, val_target.shape) 
# (12000, 784) (12000, )
 

 

케라스의 레이어(keras.layer) 패키지 안에는 다양한 층이 준비되어 있다. 가장 기본이 되는 층은 밀집층dense layer이다. 케라스의 Dense 클래스를 사용해 밀집층을 만들어보자.

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
 

 

밀집층을 가진 신경망 모델을 만들자.

model = keras.Sequential(dense)
 

 

 

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

케라스 모델 훈련 전에 손실 함수 설정값을 포함한 설정값을 설정하자.

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
 

 

compile() 함수의 첫 번째 매개변수로 손실 함수의 종류를 지정한다. 이진 분류의 경우 loss값은 'binary_crossentropy', 다중 분류의 경우 loss값은 'categorical_crossentropy'를 지정한다.

다중 분류의 경우, 정수로 된 타깃값을 사용해 크로스 엔트로피 손실을 계산한다면 'sparse_categorical_crossentropy', 원핫 인코딩으로 된 타깃값을 사용해 계산한다면 'categorical_crossentropy'를 지정한다.

complie() 함수의 두 번째 매개변수로 정확도 지표를 지정한다. 여기서는 'accuracy'를 지정했다.

케라스 모델을 훈련하자.

model.fit(train_scaled, train_target, epochs=5)
 

 

케라스 모델을 평가하자.

model.evaluate(val_scaled, val_target)
 

 

인공 신경망 모델로 성능 향상

 


 

반응형