摘要:通过对神经网络编程这本书的内容,模仿其中的代码,对初次学习神经网络进行熟悉,并逐步完成神经网络的搭建,完成对手写数字的识别。
神经网络的三大步骤
初始化函数–设定输入节点、隐藏节点和输出节点的数量。
训练–学习给定的训练集样本后,优化权重。
查询–给定输入,从输出的节点给出答案。
初始化网络–输入
1 | def __init__(self , inputnodes , hiddennodes , outputnodes , learningrate): |
其中,需要注意的地方有:
- 函数名 __init__是前后两条“_” ,如果只有一条下划线的话会报错TypeError : object() takes no parameters
参考链接:https://blog.csdn.net/qq_26489165/article/details/80595864
- 链接权重矩阵:此处wih的意思是 w:权重 i:input h:hidden ,后面的whoy也是同理
1 | self.wih = (numpy.random.rand(self.hnodes, self.inodes) - 0.5) |
- 使用lambda来创建函数, 函数接受了X,返回了scipy.special.expit(x),这就是S函数,使用lambda创建的匿名函数
1 | self.activation_function = lambda x: scipy.special.expit(x) |
初始化网络–查询
1 | #convert inouts list to 2d array |
初始化网络–训练
1 | #train the neural network |
其中,需要注意的是:
- 可以发现下面的代码和query中的几乎完全一样。因为所使用的从输入层前馈信号到最终输出层完全一样。而多处理的targets 是用来训练样本的。
- 而error中error is the (target -actual),即为反向传播的误差
- 学习率是self.lr 利用numpy.dot进行矩阵的乘法
创建神经网络对象
1 | #number of input, hidden and output nodes |
为什么选择784个输入节点呢?请记住这是28*28的结果,即是组成手写数字图像的像素个数。
选择100个隐藏节点并没有固定规定,书中认为神经网络可以发现在输入中的特征或模式,这些模式或者特征可以使用比输入本身更简短的表达,因此没有和选择比784大的数字。选择比输入节点小的数量来强制网络尝试总结输入的主要特点。但选择太少的隐藏节点就限制了网络的能力。给定10个输出层的节点对应的是10个标签。
强调一点:对于一个问题,选择多少个隐藏层节点并不存在一份最佳方法。最好的办法就是进行实验,直到找到适合你解决问题的一个数字。
测试网络
- 打开文件
1 | #load the mnist training data CSV file into a list |
将文件放在同目录下即可直接调用
- 训练网络
1 | # train the neural network |
查询网络
- 打开文件
1 | #load the mnist test data CSV file into a list |
- 打印标签
并进行matplotlib进行图形化显示并查看测试概率
1 | #get the first test record |
完整代码
1 | import numpy |
记得给代码加上头文件
1 | import numpy |