신경망은 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 있다!!
신경망을 그림으로 나타내면 다음과 같으며 크게 입력층, 은닉층, 출력층 이렇게 3개로 구분된다.
→ Input : 입력층
→ Hidden : 은닉층
→ Output : 출력층
가장 왼쪽 줄이 입력층(Input Layer) , 중간 줄이 은닉층(Hidden Layer) , 맨 오른쪽 줄이 출력층(Output Layer)
→ 책에서는 위의 신경망 구조를 '2층 신경망이라고 표현
신경망에선 "활성화 함수"라는 개념이 등장
활성화 함수란 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 수행한다.
- 신경망에서 자주 이용되는 활성화 함수 (모두 비선형)
- 시그모이드 함수
→ exp(-x)는 e^-x를 뜻하며, e는 자연상수로 2.7182...의 값을 갖는 실수
def sigmoid(x): return 1 / (1 + np.exp(-x))
Sigmoid - ReLU 함수 : 입력이 0을 넘으면 그대로 출력, 아니면 0을 출력
def relu(x): return np.maximum(0, x)
ReLU 함수 그래프
- 시그모이드 함수
- 일반적으로 이용되는 출력층의 활성화 함수
- 회귀 문제
- 항등 함수
- 이진 분류 문제
- 시그모이드 함수
- 다중 분류 문제
- 소프트맥스 함수
- 단, 오버플로 문제를 막기 위해 계산 시에 입력 신호 중 최댓값을 빼줘야 함
def softmax(a): c = np.max(a) exp_a = np.exp(a-c) # 오버플로 대책, Max 를 빼줌 sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y
- 회귀 문제
** 선형 함수를 활용화 함수로 사용하면 신경망의 층을 깊게 하는 의미가 없어진다.
<참고>
- 기계학습은 크게 "학습"과 "추론"의 두 단계를 거쳐서 이루어짐
- 학습 데이터를 사용하여 가중치 매개변수를 학습함
- 추론 단계에서는 앞서 학습한 매개변수를 사용하여 입력 데이터를 분류함
- 추론 단계에서는 출력층의 소프트맥스 함수를 생략하는 것이 일반적
- 그러나 신경망을 학습시킬 때는 출력층에서 소프트맥스 함수를 사용함
- 신경망 활성화 함수로 Sigmoid, ReLU 함수 같은 매끄럽게 변화하는 함수를 이용
- 배치(Batch)
- 입력 데이터를 묶은 것을 의미함 (즉, 하나로 묶은 데이터)
- ex) 이미지 데이터의 경우, 이미지가 지폐처럼 다발로 묶여있다고 생각하면 됨
- 배치 처리를 수행함으로써 큰 배열로 이루어진 계산을 하게 되는데, 컴퓨터에서는 큰 배열을 한꺼번에 계산하는 것이 분할된 작은 배열을 여러 번 계산하는 것보다 빠름 (즉, 배치 처리를 하면 속도 측면에서 효율적)
- 입력 데이터를 묶은 것을 의미함 (즉, 하나로 묶은 데이터)
- MNIST DATA SET
MNIST: 손글씨 숫자 이미지 집합
0부터 9까지의 숫자 이미지로 구성
훈련 이미지가 60000장, 시험 이미지가 10000장 준비됨
훈련 이미지로 모델을 학습. 시험 이미지들을 얼마나 정확하게 분류하는지를 평가함
MNIST의 이미지 데이터는 28 X 28 크기의 회색조 이미지, 각 픽셀 값은 0~255.
각 이미지에는 실제 의미하는 숫자가 레이블로 붙어 있음.
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
from dataset.mnist import load_mnist
# MNIST DATA LOAD
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
# 각 데이터의 형상 출력
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape) # (10000, 784)
print(t_test.shape) # (10000,)
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
#pil_img.show()
plt.imshow(np.array(pil_img))
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
# LOAD DATA SET 중 0번째 INDEX DATA 추출 (DATA + LABEL)
img = x_train[0]
label = t_train[0]
print(label) # 5
print(img.shape) # (784,)
img = img.reshape(28, 28) # 원래 이미지의 모양으로 변형
print(img.shape) # (28, 28)
img_show(img)
'Deep Learning > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
DL - #5-1, 오차역전파법 (0) | 2022.02.04 |
---|---|
DL - #4 -2, 신경망 학습 (0) | 2022.02.04 |
DL - #4 -1, 신경망 학습 (0) | 2022.02.04 |
DL - #2, 퍼셉트론 (0) | 2022.02.04 |
DL - 퍼셉트론 정리 (0) | 2022.01.27 |