3장의 3.5부터 시작!

 

1. 출력층 설계

 

신경망은 활성화 함수에 따라서 분류와 회귀에 사용할 수 있다.

 

분류에서는 softmax, 회귀에서는 identify_func를 사용한다.

 

 

2. 활성화 함수 구현하기

 

- identify_func

말그대로 항등함수

 

- softmax func

카테고리별로 합이 1인 확률을 구할 수 있다. 그리고 exp가 단조 증가 함수이기때문에 소프트맥스 함수를 적용해도 원소간의 대소 관계는 변하지 않는다.

 

(주의점: 지수함수를 사용하여 아주 큰 값을 뱉기때문에 오버플로 문제가 발생할 수 있다. 그래서 이를 막기위해 입력 신호 중 최댓값을 이용한다. )

 

최대값을 이용하면 큰 숫자들이 작아져서 비율은 같지만 오버플로문제를 방지할 수 있게 된다.

 

실전 정보: 학습에서는 소프트맥스를 사용하지만, 실제 inference(forward propagation)에서는 소프트맥스를 사용하지 않는다. 단조 증가 함수라서 결과는 같지만 지수함수 계산에 시간이 걸리기 때문이다.

 

 

3. 출력층의 뉴런 수 정하기

분류하고 싶은 수 만큼 정한다. 예를 들어서 0 ~ 9을 위해 10개를 쓴다.

 

 

4. 손글씨 숫자 인식

dataset = mnist, train_set은 6만장, test_set은 만장

원래는 교재의 데이터 로드 함수를 사용해야하지만 그 과정이 너무나 귀찮아서 sklearn.datasets을 사용하여 불러왔다. 그런데, 데이터가 판다스의 데이터프레임 형태로 되어있어서 교재의 데이터와 동일하게 만들어주기 위해서 to_numpy메소드를 통해 1차원 넘파이 배열로 만들어주었다.

 

 

1차원 넘파이 배열을 28x28 배열로 다시 만들어주어야 이미지를 표현할 수 있다.

 

 

5. 신경망의 추론 처리

입력층 뉴런은 784개, 출력층 뉴런은 10개로 한다. 이미지가 1차원으로 바뀌면 784로 바뀌기 때문이다.

get_data -> init_network -> predict -> accuracy 측정

 

 

 

사진 5. sklearn.preprocessing의 normalize

Normalization is the process of scaling individual samples to have unit norm. This process can be useful if you plan to use a quadratic form such as the dot-product or any other kernel to quantify the similarity of any pair of samples.

norm은 벡터의 크기를 나타낸다. 종류로는 L1, L2, max가 있다.



L1: 벡터의 원소를 절댓값으로 바꿔서 크기를 구해준다. 맨해튼 거리라고도 한다.

L2: 벡터와 원점간의 거리를 구하여 크기를 구해준다. euclidean 거리라고도 한다.

max: 원소 중 절댓값이 가장 큰 원소

 

 

위 사진을 보면 max norm처럼 제일 큰 255 화소로 나눠서 정규화한 것을 확인할 수 있다.

여기서는 오버플로를 막기 위해서 정규화라는 전처리를 사용하였는데 현업에서는 whitening을 통해 균일하게 분포시키기도 하고 0을 중심으로 분포시키는 방법을 사용한다고 한다.

 

 

 

6. 배치처리

 

그림과 같이 784 -> 784x50 -> 50x100 -> 100x10 -> 10 으로 출력층의 뉴런이 10개인 것을 확인할 수 있다.

이를 한번에 100개의 이미지를 넣으면 100x784 -> 784x50 -> 50x100 -> 100x10 -> 100x10로 100개에 대한 라벨 값을 얻을 수 있다. 이때 gpu를 사용하여 더 빠른 연산이 가능하다.

 

 

tip. np.argmax는 최댓값의 인덱스를 가져온다.

 

 

+ Recent posts