Python深度学习--简易版数字识别系统
链接:https://pan.baidu.com/s/1SMeGhW0SVYc7audg2Q1kJA?1.安装sys,os,numpy,matplotlib,opencv库组。由于本系统直接采用了现成的矩阵参数,所以整体体量相对较小,且更容易理解。下载好后,把里面的dataset文件放到本项目文件同一路径下。如果大家对代码仍有不理解的地方,可以私聊我,大家一起学习进步!2.下载训练数据mnist。
·
准备条件:
1.安装sys,os,numpy,matplotlib,opencv库组
2.下载训练数据mnist
下载地址:
链接:https://pan.baidu.com/s/1SMeGhW0SVYc7audg2Q1kJA?pwd=1aru
提取码:1aru
下载好后,把里面的dataset文件放到本项目文件同一路径下。就OK啦
准备就绪!开搞!!!
实现代码
#项目实操---数字识别系统
##### from locale import normalize
import sys,os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import pickle
import math
import cv2
#------------------WAY-------------------------
def ReLU (x):#ReLU函数,输入大于0时,直接返回该值,小于0时,则返回0.
return np.maximum(0,x)
def sigmoid(x):#sigmoid函数,对输入进行1/(1+exp(-x))运算,并返回该值
return 1/(1+np.exp(-x))
def setp_function(x):#阶跃函数,输入大于0,返回1,小于0,返回0.适用np数组,可以直接传入数组
y = x > 0
return y.astype(np.int)
def identity_function(x):#恒等函数
return X
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
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_test
def init_network():
with open("D:\B___C\python工程\explore\【源代码】深度学习入门:基于Python的理论与实现\【源代码】深度学习入门:基于Python的理论与实现\ch03\sample_weight.pkl","rb") as f:
network = pickle.load(f)
return network
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) + B3
y = softmax(a3)
return y
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
def mean_squared_error(y,t):#均方误差函数
return 0.5 * np.sum((y-t)**2)
def f_cross_entropy_error(y,t):#标准版交叉熵误差函数
delte = math.exp(-7)
return -np.sum(t * np.log(y+delte))
def cross_entropy_error1(y,t):#one_hot的交叉熵误差函数
delte = math.exp(-7)
if(y.ndim == 1):
t = t.reshape(1,t.size)
y = y.reshape(1,y.size)
batch_size = y.shape[0]
return -np.sum(t * np.log(y + delte))/batch_size
def cross_entropy_error2(y,t):#标签的交叉熵误差函数
delte = math.exp(-7)
if(y.ndim == 1):
t = t.reshape(1,t.size)
y = y.reshape(1,y.size)
batch_size = y.shape[0]
return -np.sum(t * np.log(y[np.arrange(batch_size),t] + delte))/batch_size
def img_show(img):#数组转换为图片,并显示
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
def img_transform(img):#图片转换为数组
img_array = np.asarray(img)
return img_array
#----------------CODE-------------------------------
network = init_network()
img_raw = cv2.imread(r"需要识别的照片路径")#注意,所识别照片的规格必须是28*28像素,且为黑底白字
img_gray = cv2.cvtColor(img_raw,cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray)
x = img_transform(img_gray)
x = x.reshape(784)
y = predict(network,x)
p = np.argmax(y)
print(y)
print("数字识别结果为{}".format(p))
结果展示:




由于本系统直接采用了现成的矩阵参数,所以整体体量相对较小,且更容易理解。
如果大家对代码仍有不理解的地方,可以私聊我,大家一起学习进步!!
更多推荐


所有评论(0)