import os
import pickle
import sys
sys.path.append(os.pardir) #为了导入父目录中的文件进行的设定。
from dataset.mnist import load_mnist
from PIL import Image
import numpy as np
from simple_neural import *
"""
此代码基于《深度学习入门 基于pythom的理论与实践》一书所提供的源代码编写,其中使用了该书提供的
dataset中的资料,其中load_mnist是次书中写好的代码,这里是直接调用,如有侵权,请联系删除。
"""
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
(2)、这里使用了pickle功能,此功能可以将程序运行中的对象保存为文件,第二次加载时可以快速复原此程序运行中的对象。下面函数调用的内容也基于上述提到的书,init_函数会快速调用之前保存simple_weight.pkl中的
内容,调取其已经学习之后所确定的比较好的权重与偏置参数。
def init_network():
with open ("sample_weight.pkl", 'rb') as f:
network = pickle.load(f)
return network
def net_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
x, t = get_data()
network = init_network()
# 精确度
accuracy = 0;
for i in range(len(x)): # [0,1,.....len(x)]
y = net_predict(network, x[i])
p = np.argmax(y) # 获取y中返回列表中最大值的所以,对应的就标签。如第三位对应值最大,
# 那么对应的标签就是数字2。
if p == t[i]:
accuracy += 1
print("Accuraacy: ", str(float(accuracy) / len(x)))
# Accuraacy: 0.9352 根据之前的权重参数,对测试图像进行分类,共有93.52%的图像正确归类。
2、批处理进行学习:
上述实验中我们每次处理一张图片,中间有两层隐藏层分别有50和100个神经元,我们每次读入一张图片,如果我们改成每次处理100张图片,基于数值计算的库都能够高效处理大型数组的运算,并且在神经网络的运算中当数据传送成为瓶颈时,批处理可以减小数据总线的负荷,将更多资源用于计算上。
与前面相同部分:
import os
import pickle
import sys
sys.path.append(os.pardir) #为了导入父目录中的文件进行的设定。
from dataset.mnist import load_mnist
from PIL import Image
import numpy as np
from simple_neural import *
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 net_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
不同之处:
(1)、range函数 range(start, end, step) 从start到end-1,以step为间隔的一组数据,如range(0, 9, 2)生成[0, 2, 4, 6, 8]的序列。
(2)、axis是对横着方向对数据进行处理,如argmax([0.05, 0.15, 0.8],[0.3, 0.5, 0.2], [0.3, 0.1, 0.6])得到的是[2, 1, 2]。
(3)、最后np.sum(p == t[i:i+batch_num])是比较分类结构与实际的相等情况,p ==t[…]返回的是bool型的数据用np.sum统计True的个数。如x = [1, 2, 3, 4], y = [1, 3, 3, 4],x == y 返回[T, F,T, T]。由np.sum统计T的数据。
x, t = get_data()
network = init_network()
# 精确度
accuracy = 0;
# 批处理一批的数量
batch_num = 100
for i in range(0, len(x), batch_num): # [0-batch_num-1, bctach_num~2*batach_num-1......]
x_batch = x[i:i+batch_num] #取出i到i+batcch_num内的数据,不包括i+batch_num这个值。
y_batch = net_predict(network, x_batch)
p = np.argmax(y_batch, axis=1)
accuracy += np.sum(p == t[i:i+batch_num])
print("Accuraacy: ", str(float(accuracy) / len(x)))
# Accuraacy: 0.9352 根据之前的权重参数,对测试图像进行分类,共有93.52%的图像正确归类。