- MNIST是机器学习中最有名的数据集之一,由0~9的手写数字图像构成,在下面实验中利用在上一篇初识神经网络中所学习到基本框架做一个简单实验,下面代码中许多基于《深度学习入门 基于Python的理论与实现》这本书提供的代码及资料,此文仅作文个人学习笔记,如有侵权,请联系删除。
- 下面实验主要是为了验证之前学习的神经网络的基本框架,用上述书中所提供的权重和偏置参数,对数据集中的测试图像做一个测试。
- 1、逐张图像进行学习:
- (1)load_mnist函数:
normalize:是否将图像正规化为0.0-1.0的值,如果设置为False,z=则图像输入保持0~255,这是像素的取值。 faltten:是否将输入图像展开为一维数组,否则图像为1x28x28,展开后为784。 one_hot_label:是否将标签保存为one_hot,指的是如原本图像的标签为[1,2,3,4,5],one_hot之后只有1和0, 经过计算后,最符合的标签为1,如识别出这个图像的数字是2,则one_hot表现为[0,1,0,0,0]这种模式。
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)):
y = net_predict(network, x[i])
p = np.argmax(y)
if p == t[i]:
accuracy += 1
print("Accuraacy: ", str(float(accuracy) / len(x)))
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):
x_batch = x[i: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)))
- 此文中用到上述书所提供的函数,如Load_mnist函数,在下篇的博客中再具体分析是如何构造的。
|