Chapter 3. ニューラルネットワーク
深い学習基盤から始めるために,底から始まる深い学習書を購入して実施する計画である.
本は直観的で、直接できる例題がたくさんあって、いい感じです.
Chapter 2で学んだ概念論をもとに,ニューラルネットワークを学習し体現する.
学習内容を整理する
アクティブ化関数、ステップ関数とは異なり、連続した値が出力されます.
入力が0を超えると、その入力が直接出力され、そうでない場合は0が出力されます.
アクティブ化関数として、後半では信号の代わりにRELUが使用されます.
ソフトmac関数を実装する場合は、オーバーフローの問題に注意してください.指数関数は指数が少し大きくなった場合、値の変動幅が大きいため、調整因子が増加します.
現在は0.9352ですが、今後精度がアップします.
バッチ処理はコンピュータ計算に大きなメリットがあります.I/Oデータの読み出し回数を減らすことで、CPUとGPUの高速計算比率を向上させる.パソコンの立場では、大列は小列より小列のほうが速い.
インプリメンテーション
本は直観的で、直接できる例題がたくさんあって、いい感じです.
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])
Reference
この問題について(Chapter 3. ニューラルネットワーク), 我々は、より多くの情報をここで見つけました https://velog.io/@yosep0614/Chapter-3.-신경망テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol