-
[NLP] 신경망의 활성화 함수들 (Activation Functions of Neural Network) - 3ML/NLP 2020. 3. 14. 00:45
이전 포스팅에서 신경망의 구조를 배웠으니 예제에 적용해보자.
예제로 아주 유명한 손글씨 분류 데이터셋을 가지고 해보겠다.
손글씨 숫자 인식
이미 학습된 매개변수를 사용하여 학습 과정은 생략하고, 추론 과정만 구현하겠다.
이 추론 과정을 신경망의 순전파(forward propagation)라고도 한다.
import sys, os sys.path.append(os.pardir) # 부모 디텍터리의 파일을 가져올 수 있도록 설정 from dataset.mnist import load_mnist
(x_train, y_train), (x_test, y_test) = load_mnist(flatten=True, normalize=False) print(x_train.shape) print(y_train.shape) print(x_test.shape) print(y_test.shape)
load_mnist 함수의 인수는 세 가지가 있다,
1. normalize : 입력 이미지의 픽셀값을 0.0~1.0 사이의 값으로 정규화를 할건지 // False면 원래 값 그대로 0~255 사이의 값 유지
2. flatten : 입력 이미지를 1차원 배열로 만들건지 // False면 입력 이미지를 1x28x28의 3차원 배열로, True면 784개의 원소로 이뤄진 1차원 배열로 저장한다.
3. one_hot_label : 레이블을 원-팟 인코딩 형태로 저장할지를 정한다. // False면 '7'이나 '2'와 같이 숫자 형태의 레이블을 저장함
신경망의 추론 처리
MNIST 데이터셋을 가지고 추론을 수행하는 신경망을 구현하자.
입력층 뉴런을 784개, 출력층 뉴런을 10개로 구성한다.
def get_data(): (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False) return x_test, t_test
def init_network(): with open("sample_weight.pkl", "rb") as f: network = pickle.load(f) return network
def predict(network, x): W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) + b2 z2 = sigmoid(a2) a3 = np.dot(z2, W3) + b3 y = sigmoid(a3) return y
a3 = np.dot(z2, W3) + b3 y = sigmoid(a3) return y x, t = get_data() network = init_network() accuracy_cnt = 0 for i in range(len(x)): y = predict(network, x[i]) p = np.argmax(y) # 확률이 가장 높은 원소의 인덱스를 얻는다 if p == t[i]: accuracy_cnt += 1 print("Accuracy:", str(float(accuracy_cnt)/len(x))) x, t = get_data() network = init_network()
Out: Accuracy: 0.9352
배치 처리
위에서는 이미지 하나씩만 추론에 넣었는데, 한번에 여러 장의 이미지를 넣어줄 수도 있다.
이처럼 하나로 묶은 입력 데이터를 배치라 한다.
컴퓨터는 큰 배열을 한꺼번에 계산하는 것이 분할된 작은 배열을 여러 번 계산하는 것보타 빠르다.
배치 처리를 구현해보자.
x, t = get_data() network = init_network() batch_size = 100 # 배치크기 accuracy_cnt = 0 for i in range(0, len(x), batch_size): x_batch = x[i:i+batch_size] y_batch = predict(network, x_batch) p = np.argmax(y_batch, axis=1) accuracy_cnt += np.sum(p==t[i:i+batch_size]) print("Accuracy:", str(float(accuracy_cnt)/len(x)))
Out: Accuracy: 0.9352
이후 진행할 신경망 학습에서도 데이터를 배치로 묶어서 학습하게 될 것이다.
- 밑바닥부터 시작하는 딥러닝 1
- 국내도서
- 저자 : 사이토 고키 / 이복연(개앞맵시)역
- 출판 : 한빛미디어 2017.01.03
'ML > NLP' 카테고리의 다른 글
[NLP] 간단하게 경사 하강법과 학습 알고리즘 구현해보기 (0) 2020.03.26 [NLP] 신경망 학습을 시작해보자 : 손실 함수를 중심으로↗ (0) 2020.03.18 [NLP] 신경망의 활성화 함수들 (Activation Functions of Neural Network) - 2 (0) 2020.03.13 [NLP] 신경망의 활성화 함수들 (Activation Functions of Neural Network) (0) 2020.03.13 [NLP] 딥러닝의 기원이 되는 알고리즘 : 퍼셉트론 Perceptron (0) 2020.03.03