使用python搭建一个简易的神经网络 实现对手写数字的识别(每行代码都有注释)

一些简单的介绍

如果一个简单的线性分类器不能对数据进行划分,我们就需要使用多个线性分类器来划分数据;使用多个分类器一起工作,这是神经网络的核心思想

神经元不会立刻有输入就产生反应,而是会抑制输出,知道输入增强,强大到可以触发输出,一般我们会用sigmod函数来模拟阶跃函数。

输入到下一层结果矩阵中的信号,可以表示为X = W·I,W表示权值矩阵,I表示输入矩阵。这样一来,第二层的最终输出就称为O = sigmod(X)在这里插入图片描述
在这里插入图片描述
神经网络通过调整链接权重进行学习,这种方法由误差引导。

内部节点相关联的误差:一种方法是按照链接权重的比例来分割输出层的误差,然后在每个内部节点处重组这些误差。(反向传播误差)

反向传播误差和前向馈送信号都可以使用矩阵实现。

梯度下降法是求解函数最小值的一种很好的办法,函数有很多参数的时候,这种方法仍然可以使用。

两个很常见的问题是饱和和零值权重:大信号(可能由大权重导致)导致了应用在信号上的激活函数的斜率变得非常平缓,这会降低神经网络学习到更好权重的能力;零权值的问题可能导致网络丧失学习更好权重的能力。

输入应该调整到较小值(参考sigmod函数的近0点),但不能为0;输出应该在激活函数能生成的值的范围内。

代码实现

代码逻辑:
通过反向传播误差来实现对神经网络链接权值的更新
代码输入节点,隐藏层节点,输出层节点分别为784,200,10个,目前的代码是通过调整了训练次数,学习率,隐藏层节点数量之后形成的,拥有最好的学习效果的模型,预测的准确率可以达到96%以上

import numpy
import scipy.special

class neuralNetwork:
    def __init__(self, inputNode, hiddenNode, outputNode, learningRate):
        self.inodes = inputNode
        self.hnodes = hiddenNode
        self.onodes = outputNode

        # 设置权重 input--hidden
        self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
        # 设置权重 input--hidden
        self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5), 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值