美文网首页
BP算法--手写数字识别

BP算法--手写数字识别

作者: 大端DD | 来源:发表于2020-02-15 11:21 被阅读0次

    一、步骤

    第一步:定义输入层——>隐层——>输出层——>权重——>学习率——>激活函数。

    第二步:定义训练网络(计算误差、更新权重)

    第三步:定义查询网络(个人感觉就是通过神经网络预测的结果)

    第四步:定义主函数(包括参数的取值,训练次数,数据的输入)

    二、代码


    第一步导入包——>定义一个叫NeuralNetwork的类——>初始化函数__init__。

          在这个初始化函数中,我们看到了一些参数(输入层,隐层,输出层,权重,学习率),其中权重(拿输入层和隐层之间的为例),numpy.random  表示随机收取,其中函数 normal 有三个参数(期望,标准差,shape),其中这个shape我认为是一个矩阵。所以W-ih=随机从(方差=0,标准差=

    inputs = numpy.array(inputList,ndmin=2).T:将输入的数据生成一个二维数组,T应该是转秩,inputs=Xi (根据书里)

    targets = numpy.array(targetList,ndmin=2).T:将目标结果数据生成一个二维数组,T应该是转秩,targets=Yi

    hiddenInput = numpy.dot(self.w_ih, inputs):表示 hiddenInput   =   W-ih  *  inputs  (隐层输入等于权重乘以输入层输入,即WX)

    hiddenOutput =self.activate(hiddenInput): 通过激活函数判断hiddenInput ,例如输出0、1

    finalInput = numpy.dot(self.w_ho, hiddenOutput):表示finalInput  = W_ho * hiddenOutput

    finalOutput =self.activate(finalInput):通过激活函数判断finalInput ,例如输出0、1

    计算误差和权重更新

    下面结合书里的来解释一下这些计算过程


    第三步:定义查询网络

           查询网络其实就是说return一个通过神经网络预测出来的输出值,finalOutput. 其他过程解释跟训练网络的一样

    第四步:定义主函数

    这里主要就是参数的设置

             接下来读取我们的训练数据,因为我们的数据是一行数据就是一张图片的数据,每一行开头的第一个数据就是我们的目标结果,即Yi。所以我们读取文件要一行一行的读取,我们来看看这个文档大家就明白了。

          再来设置训练次数(trainTimes )这里的训练次数可以根据自己尝试多设置其他数值,这里我设置了5次,我也尝试了其他数值,一开始的准确率为0.45.如果训练次数过小,就会导致欠拟合,过大即过拟合。大家可以自己适当的修改一下参数,多跑几次对比不同数值下的准确率。

    qbar = tqdm.tqdm(total=5):tqdm函数表示设置进度条,其中进度条总长为5                       for e   in range(trainTimes):     qbar.update(1)  :用e去遍历循环个训练次数,每次进度条读取更新的步长为1,即在总长为5下,每进一步代表训练次数更加一次。

    tqbar = tqdm.tqdm(total=100):tqdm函数表示设置进度条,其中进度条总长为100                 for record   in fileData:    tqbar.update(10) :原理跟上面的一样,但是这里的进度条更新步长我设置了10,因为在调参的时候我一开始设置 tqbar.update(5) 然后准确率比1还低,我就发现了这里进度条的步长跟准确率也有关系,试了好多的数据最后确定了10,准确率也来到0.54

    这里我就避重就轻,因为有些我也没看太明白

    imageValue = record.split(','):将数值用逗号分隔开

    inputs = numpy.asfarray(imageValue[1:]) /255.0 *0.99 +0.01:这里很细节,就是前面用逗号分隔开数据,然后这里的函数asfarray就是起到移除符号的作用。imageValue[1:]因为这里是输入数据,即x,我们就取每行第二个数值到最后,因为第一个是Y值,前面有说,最后除以255*0.99+0.01,就是图像的那个啥值最高是255,将训练数据的数值按比例缩小到0-1的范围内,经过乘以0.99后加0.01的处理后,编程0.01-0.99的数据

    这里我不太懂为啥要处理这里targets,即y,所以说我就避重就轻嘻嘻

    targets = numpy.zeros(outputNodes) +0.01:使用0填充长度为target_nodes的数组,并将其中所有值+0.01                                                                                                                   targets[int(imageValue[0])] =0.99:将训练数据中第一个值(训练数据的正确结果)对应的位置的值改为0.99                                                                                                                    neuralTest.train(inputs, targets):然后训练


    训练完,接下来就是测试

    读取文件,处理,跟上面的训练网络一样,这里的answer就是直接取Y值,然后打印出来。原理就是用查询出来的数值跟这个Y对比,一样则预测正确。

    最后打印出预测结果,用实际结果跟目标结果对比,如果相等,就返回1,否则返回0,然后用返回的数值相加起来除以全部数值的个数,这个比值就是我们的准确率。最后准确率比较低的原因,我认为是我们的训练集不够大。

    如果有理解错误的求大神指点嘻嘻

    相关文章

      网友评论

          本文标题:BP算法--手写数字识别

          本文链接:https://www.haomeiwen.com/subject/iszjfhtx.html