深度学习入门——03 MNIST手写数字图像集识别实验

  • 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)):  # [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%的图像正确归类。
  • 此文中用到上述书所提供的函数,如Load_mnist函数,在下篇的博客中再具体分析是如何构造的。

你可能感兴趣的:(python--深度学习,深度学习,python,人工智能)