Ch 07-1 인공신경망

🏆 Chapter 7 학습목표

  • 딥러닝의 핵심 알고리즘인 인공신경망에 대해 배우기
  • 대표적인 인공신경망 라이브러리인 텐서플로와 케라스 입문하기
  • 인공신경망 모델의 훈련을 돕는 도구 익히기

07-1 인공신경망

키워드 : 인공신경망, 텐서플로, 밀집층, 원-핫 인코딩

핵심 패키지와 함수: TensorFlow [Dense, Sequential, compile(), fit(), evaluate()

from tensorflow import keras #텐서플로우 라이브러리에서 케라스 불러오기 
(train_input, train_target),(test_input, test_target)=\ 
# \ 슬래시는 코드 줄이 너무 길어 줄을 나눌때 사용, \ 가 없으면 다음줄에서 에러남 
		keras.datasets.fashion_mnist.load_data() 
#케라스 내장 데이터인 패션mnist 데이터셋을 load_data() 로 불러오기 
import matplotlib.pyplot as plt # 맷플롯립 라이브러리에서 파이플롯을 임포트 

fig, axs = plt.subplots(1, 10, figsize=(10,10)) 
# plt.subplots 특정 배치에 맞추어 여러개의 섭플롯을 포함하는 Figure 를 생성하는 메서드
# 1,10 은 1행 10열 을 말하고, figsize는 가로세로 10인치를 말한다.  
for i in range(10): #0부터 9까지 내의 숫자 i 에서 
		#.imshow 는 이미지를 보여주는 메서드, cmap은 이미지의 색상을 말한다.  
    axs[i].imshow(train_input[i], cmap='gray_r') 
    axs[i].axis('off')# .axis  축과 레이블을 끄고 켤 수 있음 
plt.show() #플롯 보여주기 
#처음 10개 샘플의 타깃값을 리스트로 만든 후 출력 
print([train_target[i] for i in range(10)])
  • 리스트 내포
    list 内for 인것 같다. 또는 리스트 내포(內包). (나의 뇌피셜임)

영문으로는 List Comprehension 이라 한다.

리스트 내포를 사용하면 좀 더 편리하고 간단하게 코드를 짤 수 있다.

형식 → 리스트명 = [표현할 식 for 변수명 in 반복할 대상]

import numpy as np #넘파이 임포트 

print(np.unique(train_target, return_counts=True))
# . unique 메서드: 주어진 넘파이 배열의 모든 고유값을 검색하여 정렬
# return_counts=True 이면 고유값의 개수 배열을 반환한다.  

fashin mnist 데이터셋

  • train_input - 60000 개의 이미지, 28*28 픽셀크기, train_target - 60000개 원소 있는 1차원 배열
  • test_input - 10000 개 이미지, 28*28 픽셀크기, test_target - 10000개 원소 있는 1차원 배열
  • 0~9까지의 레이블마다 6000개의 샘플이 들어있다.
  • 각 픽셀이 0~255 사이의 정숫값을 가진다.

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

Stochastic Gradient Descent (SGD, 확률적 경사하강법) Classifier 이용

train_scaled = train_input / 255.0
# 0~1 사이의 값을 가지도록 255로 나누어 정규화한다. 

train_scaled = train_scaled.reshape(-1, 28*28)
#2차원 배열인 각 샘플을 1차원 배열로 만든다.  SGDClassifier는 2차원 입력이 불가하기 때문이다. 
#reshape(-1,정수) 의 경우 -1의 의미는 뒤에 입력된 정수의 크기만한 열이 생성되도록 행의 길이를 정하는 것이다.
#여기서는 28*28, 즉 784개의 열이 생성되도록 행의 개수가 정해지고 결국 형태는 (60000,784) 가 된다. 
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier

sc = SGDClassifier(loss='log', max_iter=5, random_state=42)
#반복회수는 5로 지정, 

scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
#교차검증을 이용하여 성능 확인 

print(np.mean(scores['test_score'])) # 0.8195

인공신경망


생물학적 뉴런의 간략 모식도. 전기 신호가 수상돌기에서 축삭돌기방향으로 흐르며 다른 수상돌기로 전달됨. 수상돌기에서 신호를 받아들이고 축삭돌기에서 신호를 내보낸다. 축삭돌기가 다음 수상돌기로 연결이 생성되는 것을 시냅스라고 함.

인공신경망은 위의 자연신경망의 모습에서 영감을 얻어 만들어졌다.
입력층, 뉴런(유닛), 가중치, 출력층 등으로 이루어진다.

텐서플로와 케라스

텐서플로: 구글에서 개발한 딥러닝 라이브러리. 연산에 GPU 를 사용한다.

케라스: 텐서플로의 고수준 API. 연산시 텐서플로(이외 기타도 가능) 를 백엔드로 사용한다.

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)

keras.layers 패키지에는 다양한 층 준비되어 있음

밀집층(dense layer): 가장 기본이 되는 층, 양쪽의 뉴런이 모두 연결되어 있기에 완전연결층(fully connected layer) 라고도 함

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
# 케라스.레이어스 내의 Dense 클래스 이용해 밀집층 만들기
# 차례대로 하이퍼 파라미터(매개변수)는 (뉴런 개수, 뉴런의 출력에 적용할 함수, 입력의 크기) 
# 뉴런 개수: 10개, 10개의 패션 아이템으로 분류하기 때문
# 활성함수: 10개의 뉴런에서 출력되는 값을 '확률'로 바꾸기 위해 소프트맥스 이용
# 입력의 크기: 각각 10개의 뉴런에 몇 개의 입력을 받는지 튜플로 입력 
# 이 과정을 통해 신경망 층이 만들어진다. 
model = keras.Sequential(dense)
#케라스의 Sequential 클래스에 위에서 만든 밀집층을 전달하여 신경망 모델을 만든다. 

잊지 말것! 입력층과 출력층 사이 뉴런이 연결이 되며 각 연결마다 가중치가 있음. 또한 절편은 뉴런마다 더해지나 모식도에서 간단하게 나타내기 위해 표시도 안하는 경우가 있음을 명심.

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
#모델을 훈련하기 전 설정을 하는 단계로 compile 메서드를 사용
# sparse_categorical_crossentropy: 정수로 된 타깃값을 원핫인코딩을 거치지 않고 
#크로스 엔트로피 손실함수를 이용할 수 있게 해주는 손실함수
# metrics 매개변수에 정확도를 출력하도록 accuracy 지정  
model.fit(train_scaled, train_target, epochs=5) 
# fit 메서드 이용해 모델을 훈련한다. 
# 입력값, 타깃값, 반복할 에포크 회수
# 최종 loss 0.4366, accuracy 0.8562 -> 로지스틱 회귀로 분류한 스코어보다(0.8195) 낫다. 
# 여기까지는 훈련만 한 것. 
model.evaluate(val_scaled, val_target)
# evaluate 메서드 사용하여 성능 평가하기.
# 데이터는 따로 떼어둔 검증세트 이용
# loss 0.4592, accuracy 0.8485 

출처 : 혼자공부하는머신러닝+딥러닝, 박해선 저, 한빛미디어

좋은 웹페이지 즐겨찾기