写在开头:这个实验和matlab手写神经网络实现识别手写数字一样。


实验说明

一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架。恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手写数字图片,于是我就尝试用matlab写一个网络。

  • 实验数据:5000张手写数字图片(.jpg),图片命名为1.jpg,2.jpg…5000.jpg。还有一个放着标签的excel文件。

  • 数据处理:前4000张作为训练样本,后1000张作为测试样本。

  • 图片处理:用matlab的imread()函数读取图片的灰度值矩阵(28,28),然后把每张图片的灰度值矩阵reshape为(28*28,1),然后把前4000张图片的灰度值矩阵合并为x_train,把后1000张图片的灰度值矩阵合并为x_test。



神经网络设计

  • 网络层设计:一层隐藏层,一层输出层

  • 输入层:一张图片的灰度值矩阵reshape后的784个数,也就是x_train中的某一列

  • 输出层:(10,1)的列向量,其中列向量中最大的数所在的索引+1就是预测的数字

  • 激励函数:sigmoid函数(公式)

  • 更新法则:后向传播算法(参考

  • 测试:统计预测正确的个数

网络实现

  • 函数说明:读图片的函数(read_photo() )、读excel的函数(read_excel(path) )、修正函数(layerout(w,b,x) )、训练函数(mytrain(x_train,y_train) )、测试函数(mytest(x_test,y_test,w,b,w_h,b_h) )、主函数(main() )

具体代码如下:

# -*- coding: utf-8 -*-

from PIL import Image

from pylab import *

import numpy as np

import xlrd

#读取图片的灰度值矩阵
def read_photo():
for i in range(5000):
j = i+1
j = str(j)
st = '.jpg'
j = j+st
im1 = array(Image.open(j))
#(28,28)-->(28*28,1)
im1 = im1.reshape((784,1))
#把所有的图片灰度值放到一个矩阵中
#一列代表一张图片的信息
if i == 0:
im = im1
else:
im = np.hstack((im,im1))
return im #读取excel文件内容(path为文件路径)
def read_excel(path):
# 获取所有sheet
workbook = xlrd.open_workbook(path)
sheet_names = workbook.sheet_names() # 根据sheet索引或者名称获取sheet内容
for sheet_name in sheet_names:
isheet = workbook.sheet_by_name(sheet_name) #获取该sheet的列数
ncols = isheet.ncols
#获取每一列的内容
for i in range(ncols):
if i == 0:
xl1 = isheet.col_values(i)
xl1 = np.array(xl1)
xl1 = xl1.reshape((10,1))
xl = xl1
else:
xl1 = isheet.col_values(i)
xl1 = np.array(xl1)
xl1 = xl1.reshape((10,1))
xl = np.hstack((xl,xl1))
return xl #layerout函数
def layerout(w,b,x):
y = np.dot(w,x) + b
t = -1.0*y
# n = len(y)
# for i in range(n):
# y[i]=1.0/(1+exp(-y[i]))
y = 1.0/(1+exp(t))
return y #训练函数
def mytrain(x_train,y_train):
'''
设置一个隐藏层,784-->隐藏层神经元个数-->10
''' step=int(input('mytrain迭代步数:'))
a=double(input('学习因子:'))
inn = 784 #输入神经元个数
hid = int(input('隐藏层神经元个数:'))#隐藏层神经元个数
out = 10 #输出层神经元个数 w = np.random.randn(out,hid)
w = np.mat(w)
b = np.mat(np.random.randn(out,1))
w_h = np.random.randn(hid,inn)
w_h = np.mat(w_h)
b_h = np.mat(np.random.randn(hid,1)) for i in range(step):
#打乱训练样本
r=np.random.permutation(4000)
x_train = x_train[:,r]
y_train = y_train[:,r]
#mini_batch
for j in range(400):
#取batch为10 更新取10次的平均值
x = np.mat(x_train[:,j])
x = x.reshape((784,1))
y = np.mat(y_train[:,j])
y = y.reshape((10,1))
hid_put = layerout(w_h,b_h,x)
out_put = layerout(w,b,hid_put) #更新公式的实现
o_update = np.multiply(np.multiply((y-out_put),out_put),(1-out_put))
h_update = np.multiply(np.multiply(np.dot((w.T),np.mat(o_update)),hid_put),(1-hid_put)) outw_update = a*np.dot(o_update,(hid_put.T))
outb_update = a*o_update
hidw_update = a*np.dot(h_update,(x.T))
hidb_update = a*h_update w = w + outw_update
b = b+ outb_update
w_h = w_h +hidw_update
b_h =b_h +hidb_update return w,b,w_h,b_h #test函数
def mytest(x_test,y_test,w,b,w_h,b_h):
'''
统计1000个测试样本中有多少个预测正确了
预测结果表示:10*1的列向量中最大的那个数的索引+1就是预测结果了
'''
sum = 0
for k in range(1000):
x = np.mat(x_test[:,k])
x = x.reshape((784,1)) y = np.mat(y_test[:,k])
y = y.reshape((10,1)) yn = np.where(y ==(np.max(y)))
# print(yn)
# print(y)
hid = layerout(w_h,b_h,x);
pre = layerout(w,b,hid);
#print(pre)
pre = np.mat(pre)
pre = pre.reshape((10,1))
pren = np.where(pre ==(np.max(pre)))
# print(pren)
# print(pre)
if yn == pren:
sum += 1 print('1000个样本,正确的有:',sum) def main():
#获取图片信息
im = read_photo()
immin = im.min()
immax = im.max() im = (im-immin)/(immax-immin) #前4000张图片作为训练样本
x_train = im[:,0:4000]
#后1000张图片作为测试样本
x_test = im[:,4000:5000] #获取label信息
xl = read_excel('./label.xlsx') y_train = xl[:,0:4000]
y_test = xl[:,4000:5000] print("---------------------------------------------------------------")
w,b,w_h,b_h = mytrain(x_train,y_train)
mytest(x_test,y_test,w,b,w_h,b_h)
print("---------------------------------------------------------------") if __name__ == '__main__':
main()

实验结果

---------------------------------------------------------------
mytrain迭代步数:300
学习因子:0.3
隐藏层神经元个数:28
1000个样本,正确的有: 933
---------------------------------------------------------------

迭代300步,正确率就有93.3%啦,还不错的正确率~

python手写神经网络实现识别手写数字的更多相关文章

  1. matlab手写神经网络实现识别手写数字

    实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手写数字图片,于是我就尝试用matlab写一个网络. 实验数据:500 ...

  2. 使用神经网络来识别手写数字【译】(三)- 用Python代码实现

    实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...

  3. 如何用卷积神经网络CNN识别手写数字集?

    前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...

  4. python机器学习使用PCA降维识别手写数字

    PCA降维识别手写数字 关注公众号"轻松学编程"了解更多. PCA 用于数据降维,减少运算时间,避免过拟合. PCA(n_components=150,whiten=True) n ...

  5. 解决python中import时无法识别自己写的包和模块的方法

    我们用pycharm打开自己写的代码,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的文件,但是我们写的文件又确实在同一个文件夹中, 这种问题可以用下面的方法解决: 1)打开File ...

  6. Python实现神经网络算法识别手写数字集

    最近忙里偷闲学习了一点机器学习的知识,看到神经网络算法时我和阿Kun便想到要将它用Python代码实现.我们用了两种不同的方法来编写它.这里只放出我的代码. MNIST数据集基于美国国家标准与技术研究 ...

  7. NN:神经网络实现识别手写的1~9的10个数字—Jason niu

    import numpy as np from sklearn.datasets import load_digits from sklearn.metrics import confusion_ma ...

  8. Tensorflow搭建卷积神经网络识别手写英语字母

    更新记录: 2018年2月5日 初始文章版本 近几天需要进行英语手写体识别,查阅了很多资料,但是大多数资料都是针对MNIST数据集的,并且主要识别手写数字.为了满足实际的英文手写识别需求,需要从训练集 ...

  9. 用BP人工神经网络识别手写数字

    http://wenku.baidu.com/link?url=HQ-5tZCXBQ3uwPZQECHkMCtursKIpglboBHq416N-q2WZupkNNH3Gv4vtEHyPULezDb5 ...

随机推荐

  1. DTD与XML Schema都是XML文档。(选择1项)

    DTD与XML Schema都是XML文档.(选择1项) A.正确 B.不正确 解答:DTD不是XML文件, schema是XML文档

  2. php -- instanceof、class_exists、insterface_exists、method_exists、get_class、get_parent_class

    class_exists:类是否存在 在创建对象之前判断类是否存在,如果不存在就应该先加载类,再创建对象,容错. interface_exists:接口是否存在 method_exists:方法是否存 ...

  3. 【BZOJ】1068: [SCOI2007]压缩(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...

  4. 【BZOJ】1037: [ZJOI2008]生日聚会Party(递推+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1037 看来自己越来越弱了... 这些计数题设计的状态都很巧妙,,自己智商太低QAQ 和矩阵dp做的那 ...

  5. 转载:基于Redis实现分布式锁

    转载:基于Redis实现分布式锁  ,出处: http://blog.csdn.net/ugg/article/details/41894947 背景在很多互联网产品应用中,有些场景需要加锁处理,比如 ...

  6. centos配置ssh免密码登录后,仍提示输入密码

    配置SSH无密码登录需要3步: 1.生成公钥和私钥 2.导入公钥到认证文件,更改权限 3.测试 1.生成公钥和私钥 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 默 ...

  7. NYOJ 1009 So Easy[Ⅰ]【简单题】

    /* 题目大意:求三角形的外接圆 解题思路:c/sin(C)=2R,先求出cos,在求出sin 关键点:直接调用库 解题人:lingnichong 解题时间:2014-10-18 10:19:33 解 ...

  8. angular使用codemirror ui-codemirror在模态框或者tab中没有缩进,内容也会在点击之后才显示的问题

    <textarea ui-codemirror="{ mode: 'javascript', lineNumbers: true, theme: 'solarized dark', l ...

  9. cookie绕过验证码并关联对话发送一个随笔草稿箱

    先手动发送一个草稿,然后用fiddler取到body参数 代码: #coding:utf-8import requests login_url="https://passport.cnblo ...

  10. UE4与Visual Studio版本对应关系

    首先,要注意,Visual Studio 2015(VS2015)默认安装时并不包含 C++ 的工具.在安装 VS2015 时,需选择 自定义 安装并勾选 C++ 组件,这对之后的工作时必须的.如果已 ...