简单的手写数字识别(mnist数据集)

加载数据测试:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/2/15 12:52
# @Author : LZQ
# @Software: PyCharm
import sys,os
sys.path.append(os.pardir)#为了导入父目录中的文件而进行的设定
from dataset.mnist import load_mnist

# load_mnist函数以“(训练图像 ,训练标签 ),(测试图像,测试标签 )”的
# 形式返回读入的MNIST数据。
# 第一次调用会花费几分钟......
(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)
# 结果:
(60000, 784)
(60000,)
(10000, 784)
(10000,)

手写数字5的识别:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/2/15 13:03
# @Author : LZQ
# @Software: PyCharm
import os,sys
sys.path.append(os.pardir) #为了导入父目录中的文件而进行的设定
import numpy as np
from dataset.mnist import load_mnist
from  PIL import Image

def img_show(img):
    pil_img=Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train,t_train),(x_test,t_test)=load_mnist(flatten=True,
                                             normalize=False)
'''
这里需要注意的是, flatten=True时读入的图像是以一列(一维) NumPy
数组的形式保存的。因此,显示图像时,需要把它变为原来的28像素 × 28
像素的形状。可以通过 reshape()方法的参数指定期望的形状,更改NumPy
数组的形状。此外,还需要把保存为NumPy数组的图像数据转换为PIL用
的数据对象,这个转换处理由Image.fromarray()来完成。
'''
img=x_train[0]
label=t_train[0]
print(label)
print(img.shape)
img=img.reshape(28,28)#把形状变成原来的尺寸
print(img.shape)

img_show(img)

结果:

单数据处理:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/2/15 13:15
# @Author : LZQ
# @Software: PyCharm
import os,sys
sys.path.append(os.pardir)#为了导入父目录中的文件而进行的设置
import numpy as np
from dataset.mnist import load_mnist
import pickle


def get_data():
    (x_train, t_train), (x_test, t_test) = \
        load_mnist(flatten=True, normalize=True,one_hot_label=False)
    return x_test,t_train
def init_network():
    with open("sample_weight.pkl",'rb') as f:
        network=pickle.load(f)

    return network

def sigmoid(a):
    return 1/(1+np.exp(-a))
def softmax(a):
    c=np.max(a)
    exp_a=np.exp(c-a)
    sum_exp_a=np.sum(exp_a)
    y=exp_a/sum_exp_a
    return y
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)
    y=softmax(a3)

    return y

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

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)))

结果:Accuracy:0.1003

批处理:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/2/24 20:59
# @Author : LZQ
# @Software: PyCharm

import os,sys
sys.path.append(os.pardir)#为了导入父目录中的文件而进行的设置
import numpy as np
from dataset.mnist import load_mnist
import pickle


def get_data():
    (x_train, t_train), (x_test, t_test) = \
        load_mnist(flatten=True, normalize=True,one_hot_label=False)
    return x_test,t_train
def init_network():
    with open("sample_weight.pkl",'rb') as f:
        network=pickle.load(f)

    return network

def sigmoid(a):
    return 1/(1+np.exp(-a))
def softmax(a):
    c=np.max(a)
    exp_a=np.exp(c-a)
    sum_exp_a=np.sum(exp_a)
    y=exp_a/sum_exp_a
    return y
def predict(network,x):
    print(network)
    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)
    y=softmax(a3)

    return y


x,t=get_data() #获取数据
network=init_network()

batch_size=100 #批数量
accuracy_cnt=0
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])

print("Accuracy:"+str(float(accuracy_cnt)/len(x)))

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐