이숭간 공부기록
밑바닥부터 시작하는 딥러닝 3장(2)_신경망 본문
#다차원배열을 이용하여 신경망 구현
배열의 차원수 - 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 |
---|