手写感知器的反向传播算法 Part2:基于理论推导的代码实践:如何实现自己的第一个神经网络完成手写体识别?(上)

前言:

本文是手写实现BP神经网络的第二篇文章,也是本专栏中最核心的一篇文章,因为本文作者主要介绍的是作者的程序是如何实现的。但是整个网络最大的难度其实是在于计算梯度,搞清楚怎么做反向传播才能写出正确的代码。关于如何计算梯度部分,请看作者的上一篇文章,链接在下面:

手写感知器的反向传播算法 Part1:梯度传播的理论推导:如何计算梯度?-优快云博客

在上一篇文章之中作者给出了应该如何将梯度运算运用在程序中的大致思路,这篇文章中作者就将一一加以实现。那么闲言少叙,让我们进入正题。记住作者的一句话:掌握了梯度传播的计算方式,那么整个BP神经网络就已经完成了一半了。由于一整个程序的讲解有些过于庞大和冗长了,所以作者这里决定分成上下两个部分。上篇讲的是除了前向推理,反向传播操作的具体计算的代码的所有部分,读者会在这个模块了解应该怎么写出一个神经网络,框架应该是如何的。而具体怎么计算的代码会在下篇进行呈现。

Part1:整体结构简介:

完整的程序由两个部分组成:

第一个部分是对于图片的处理过程,在BP神经网络这个语境下至少包含一个作用:将28*28的图片展开成为784*1的列向量。其余的作用作者之后会详细讲到。

第二个部分就是主程序。主程序的构成主要是三个Part:

Part1. main函数中完成对于网络结构,学习率的确定。在本程序中,注意学习率,网络结构,和每一层的参数都是可以灵活调整的。这就是为什么第一个部分和第二个部分不能合二为一的原因:如果我们固定了网络结构就只需要第二个和第三个Part了

Part2.“BP_Model_for_classification”类。这个类主要是为了完成深度学习的整个流程设计的:在这个类中最主要的两个函数是create_model和train函数,前者是使用第三个类创建一个模型,后者是使用这个创造出来的model,调用其成员函数完成训练时候的前向推理和反向传播等。

Part3:"BP_foward_for_classification"类。这个类的目的是承载所有的计算过程。train函数调用的所有的计算操作都是这个类中的成员函数。这个部分作者会在(下)中详细介绍。

那么下面作者将按照顺序依次给出代码和解析。

Part2:准备部分:图像处理:

思路解析:

1.图像是什么样的?

手写体识别的图片一般都是一张白底黑字的图片,图上实际上只有黑色与白色这两种颜色。

 这个汉字在python中读入成为数字矩阵之后,这个字的数字矩阵只有两个数字,分别是255和0。其中0元素对应的点位是空白,而255元素对应的点位是黑色。

2.我们想要将图片处理成什么样子?

(1)从减小计算量的角度思考:图片的两种色块分别表示为255和0,那么从减小计算量的角度思考那么设定成1和0或者是1和-1这样的操作是和原本的图片效果一致。但是具体设定为哪种下面作者会有一个明确的介绍

(2)从标准化的角度思考:在CV的领域之中,实际使用的时候,torchvision提供了一个transforms类可以对于图片进行操作。其能达成的效果比如裁剪,翻转等可以处理原图片产生一些“新”的数据,其最大的益处之一就是可以扩充数据集。但是在这个程序之中最重要的是一步Normalize操作。这一步操作的目的是对于图片进行正则化,处理成均值为0,方差为1的矩阵。这一步经作者自己尝试之后得到的结论是有助于收敛。关于这个模块具体的实验论证可以看作者后续的文章。这里只给出结论:torchvision中的Normalize将图片处理成了1和-1的数字矩阵。

 于是基于上面这两个部分的分析,我们已经确定了总方针:将图片变成每一列由1和-1组成的列向量,并且在最后一行加上所属于的类别序号。

数据集形式:

数据集形如下:

其中每一个文件夹中对应着一种文字对应的图片。

具体代码:

import numpy as np
from PIL import Image

from main_pic import copy

# import main
np.random.seed(0)
data_all = np.zeros((64*64+1,5620),dtype=float)
count = 0
root = "train_2022/"
for i in range(10):
    for j in range(500):
        img = Image.open(root + f"{i}/{j+1}.bmp").convert("L")
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值