简单的手写数字识别(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)))