Machine Learning/혼자 공부하는 머신러닝+딥러닝

7-1 인공신경망(혼자공부하는 머신러닝 딥러닝)

햄스텅 2022. 1. 4. 21:00

키워드정리

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

 

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

전체 코드

딥러닝과 인공 신경망 알고리즘을 이해하고 텐서플로를 사용해 간단한 인공 신경망 모델 만들기

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)

print(test_input.shape, test_target.shape)

몇 개의 샘플을 그림으로 출력, 맷플롯립 라이브러리로

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

unique()함수로 레이블 당 샘플 개수 확인하기

import numpy as np
print(np.unique(train_target, return_counts=True))

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

이 훈련 샘플은 60,000개나 되기 때문에 전체 데이터를 한꺼번에 사용하여 모델을 훈련하는 것보다 샘플을 하나씩 꺼내서 모델을 훈련하는 방법이 더 효율적으로 보인다. 이런 상황에 잘 맞는 방법이 경사하강법이다.

#reshape메서드를 이용해 2차원 배열을 1차원 배열로 펼치기
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1,28*28)

SGDClassifier는 2차원 입력을 다루지 못하기 때문에 각 샘플을 1차원 배열로 만들어야함

print(train_scaled.shape)

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(scores['test_score']))

max_iter = 반복횟수

이미지 분류 문제에는 인공신경망이 잘 맞다
가장 기본적인 인공신경망은 확률적 경사 하강법을 사용하는 로지스틱 회귀와 같다

인공신경망은 기존의 머신러닝 알고리즘이 잘 해결하지 못했던 문제에서 높은 성능을 발휘하는 새로운 종류의 머신러닝 알고리즘일 뿐이다

딥러닝은 인공신경망과 거의 동의어로 사용되는 경우가 많다. 혹은 심층 신경망을 딥러닝이라고 부른다.

import tensorflow as tf

from tensorflow import keras

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

로지스틱 회귀에서는 교차검증을 사용해 모델을 평가했지만, 인공 신경망에서는 교차 검증을 잘 사용하지 않고 검증 세트를 별도로 덜어내어 사용한다.

이렇게 하는 이유는


1.   딥러닝 분야의 데이터셋은 충분히 크기 때문에 검증 점수가 안정적이고
2.   교차 검증을 수행하기에는 훈련 시간이 너무 오래 걸리기 때문이다.



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)

먼저, 훈련세트로 모델을 만들고 검증세트로 훈련한 모델을 평가한다

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

뉴런개수, 뉴런의 출력에 적용할 함수, 입력의 크기

model = keras.Sequential(dense)

활성화 함수 = 소프트맥스와 같이 뉴런의 선형 방정식 계산 결과에 적용되는 함수

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy') #다중분류

타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 것 = 원-핫 인코딩

따라서, 다중 분류에서 크로스 엔트로피 손실 함수를 사용하려면, 0.1.2와 같이 정수로 된 타깃값을 원-핫 인코딩으로 변환해야 한다

print(train_target[:10])

metrics매개변수에 정확도 지표 = accuracy

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

걸린시간/손실/정확도

model.evaluate(val_scaled,val_target)

 

'Machine Learning > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글

7-2 심층신경망  (0) 2022.01.23
6-3.p318~주성분 분석  (0) 2021.10.29
6-2.p303~ k-평균  (0) 2021.10.29
6-1.p286~ 군집 알고리즘  (0) 2021.10.28
5-3.p263~ 트리의 앙상블  (0) 2021.10.28