이숭간 공부기록

밑바닥부터 시작하는 딥러닝 3장(2)_신경망 본문

공부공부/딥러닝

밑바닥부터 시작하는 딥러닝 3장(2)_신경망

이숭간 2020. 8. 2. 23:22
728x90

#다차원배열을 이용하여 신경망 구현

배열의 차원수 - np.ndim()

배열의 형상 - np.array클래스의 인스턴스 변수인 shpae으로 알수있음 (몇 곱하기 몇 행렬인지), 튜플로반환

두 행렬의 곱 - np.dot(A, B) : 행렬 A,B의 곱

 

곱해지는 행렬의 대응하는 차원의 원소수만 맞춰주면 np.dot()으로 한번에 Y를 계산할수 있다.

 np.dot()을 사용하지 않으면 for문으로 계산해야하는데 개귀찮 ㅇㅇ

 

# 3층 신경망 구현하기

 

구현 정리

# 출력층 설계하기 : 기계학습의 타입에따라 사용하는 활성화함수가 달라진다.

분류 - 소프트맥스함수 : 데이터가 어느 클래스에 속하느냐?? (ex.사진속 인물의 성별분류하기)

회귀 - 항등 함수 : 입력데이터에서 연속적인 수치를 예측하는문제 (ex. 사진속 인물의 몸무게는 57.4정도?)

 

#항등함수 구현하기

구현할것도 없음. 그냥 입력그대로 출력

 

# 소프트맥스함수 구현하기

소프트맥스 함수

exp(x) = e^x 

n = 출력층의 뉴런수, y_k는 그중 k번째 출력

a_k = 입력신호

 

 

소프트맥스함수 파이썬 구현

주의할점 - 오버플로문제 : 지수함수의 급격하게 증가하는 문제때문에 너무큰값끼리 연산을 하게되면 결과가 불안정해짐

--> 해결 : 입력신호값 중에서 최댓값을 입력신호값에서 빼줌 (어떤 정수를 더하거나 빼도 결과는 바뀌지않음)

import numpy as np

def softmax(a):
    c = np.max(a)  # 입력신호중 최댓값 
    exp_a = np.exp(a - c)   # 오버플로 방지
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    
    return y

# 소프트맥스 함수의 특징

출력의 총합이 1이다. --> 함수의 출력을 확률로 해석가능

소프트맥수 함수를 적용해도 각 원소(입력신호)의 대소관계는 변하지 않음. (지수함수가 단조증가함수라서)

즉, 이는 신경망으로 분류할때 실제로는 소프트맥스 함수를 생략해도 같은 결과를 얻음을 뜻한다.

 

기계학습의 학습(얘는원피스야 원피스야 원피스야) 과 추론(미지의 데이터에 대해서 추론. 어 이건 원피스야) 이라는 관점에서, 실제 추론할때는 출력층의 소프트맥스함수를 생략하지만, 신경망을 학습시킬때는 소프트맥스 함수를 사용한다. 

 

# 출력층의 뉴런 수 정하기 

일반적으로 분류에서는 분류하고싶은 클래스수만큼 설정

주어진 데이터에대해서 신경망은 출력층에서 가장큰값을 출력한 뉴런을 해당 데이터가 속한 클래스라고 선택한다.

 

# 신경망의 문제해결

학습 - 학습데이터를 사용해 가중치 매개변수를 학습

추론 - 학습한 매개변수를 사용하여 입력데이터 분류

 

# MNIST 데이터셋

해당 데이터셋을 내려받아 이미지를 넘파이 배열로 변환해주는 파이썬스크립트 제공

mnist.py 임포트하여 사용 - 작업 디렉터리 설정 ch01~08중 하나로

 

@ 파이썬의 피클기능 - 프로그램 실행중에 특정 객체를 파일로 저장하는 기능. 저장해둔 피클파일을 이용하면 실행당시 객체를 즉시복원할수 있음 

이미지표시 - PIL 모듈을 사용함.

 

 

# 데이터처리

정규화 - 데이터를 특정범위로 변환하는 처리

전처리 - 신경망의 입력데이터에 특정 변환을 가하는것

MINIST 데이터셋 추론의 예시에서는 입력 이미지 데이터에 대한 전처리 작업으로 정규화를 수행한것.

 

 

'공부공부 > 딥러닝' 카테고리의 다른 글

밑바닥부터 시작하는 딥러닝 3장(1)_신경망  (0) 2020.08.02