Chapter 3. ニューラルネットワーク


深い学習基盤から始めるために,底から始まる深い学習書を購入して実施する計画である.
本は直観的で、直接できる例題がたくさんあって、いい感じです.
Chapter 2で学んだ概念論をもとに,ニューラルネットワークを学習し体現する.
学習内容を整理する

しんごうかんすう


アクティブ化関数、ステップ関数とは異なり、連続した値が出力されます.
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

ReLU関数


入力が0を超えると、その入力が直接出力され、そうでない場合は0が出力されます.
アクティブ化関数として、後半では信号の代わりにRELUが使用されます.
def relu(x):
	return np.maximum(0, x)

ソフトMax関数


ソフトmac関数を実装する場合は、オーバーフローの問題に注意してください.指数関数は指数が少し大きくなった場合、値の変動幅が大きいため、調整因子が増加します.
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

MNIST手書きデジタル認識

import sys, os
import numpy as np
import pickle
from mnist import load_mnist #mnist 파일 로드
from PIL import Image
from matplotlib.pyplot import imshow #Jupyter 웹상에서 보기위해

#normalize(0~1 사이값으로 변환), flatten(1차원 배열로 변환 유무) 인자 입력
(x_train, t_train), (x_test, t_test)=load_mnist(flatten=True, normalize=False)

print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)
Output(60000, 784) (60000,) (10000, 784) (10000,)
#이미지를 보여줄 함수 정의
def img_show(img):
    img = img.reshape(28, 28) #1차원 배열이라 다시 2차원으로 reshape
    imshow(img)

def get_data():
    (x_train, t_train), (x_test, t_test) = \
    load_mnist(normalize=True, flatten=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 = softmax(a3)
    
    return y

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

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

img = x_train[0]
label = t_train[0]

x, t= get_data()
network = init_network()

img_show(img) #예제 이미지 표시
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)))
OutputAccuracy:0.9352
現在は0.9352ですが、今後精度がアップします.

レイアウト


バッチ処理はコンピュータ計算に大きなメリットがあります.I/Oデータの読み出し回数を減らすことで、CPUとGPUの高速計算比率を向上させる.パソコンの立場では、大列は小列より小列のほうが速い.
インプリメンテーション
batch_size = 100
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])