# 手写数字识别神经网络
## 程序依赖
- pyyaml
- numpy
- sklearn
- matplotlib
- abc
## 选题
- 利用numpy完成手写数字数据集的识别,完成多分类问题,搭建神经网络,并且完成模型的训练以及性能评估,可视化数据
## 用到的知识
1. sklearn 数据集的提取分割
2. yaml配置文件使用
3. numpy实现各个神经层
4. 参数初值选择
5. 梯度下降方法选择
6. sklearn 分类模型评估
7. matplotlib数据可视化
8. 设计模式
9. Markdown写报告
10. 防脱发技术
## 框架
- 整体框架
![框架](./pic/1.png)
- 代码框架
```txt
.
├── save_params.pkl 训练好的模型
├── params.yaml 神经网络搭建参数配置
├── tools.py 卷积和池化过程用到的转换
├── im2col 将图像卷积转化为矩阵相乘的形式
└── col2im 反向传播将矩阵相乘形式转化为原图像
├── optimizer.py 参数更新方法
├── OptimizerBase类 参数更新方法基类,必须重写覆盖虚函数才能构造类
└── update 对参数进行更新,子类的update同作用
├── AdaGrad类 AdaGrad方法
└── SGD类 随机梯度下降法
├── network.py 主程序,将所有其它模块连接起来
└── NeuralNetwork类 神经网络总类
├── test 模型测试
├── loadAndTest 加载已经训练好的模型然后测试
├── runNetWork 训练模型
├── predict 所有网络层前向传播
├── update 所有网络层反向传播并更新参数
├── getParams 获取yaml配置文件参数
├── saveParams 保存训练好的参数模型
├── getData 获取训练集和测试集
├── getLayer 根据配置文件生成神经网络
└── getTrainData 随机抽取训练数据
├── method.py 参数初始化方法
├── ParamsInitBase类 参数初始化基类
├── getParams 获取卷积层初始化参数,子类同
└── getAffineParams 获取Affine层初始化参数,子类同
├── He 类 He方法初始化参数
└── Xavier类 Xavier方法初始化参数
├── layer.py 神经网络层
├── LayerBase类 神经网络层基类
├── forward 前向传播,子类同
├── backward 反向传播,子类同
├── update 参数更新,子类同
├── saveParams 参数保存,子类同
└── loadParams 参数加载,子类同
├── AffineLayer类
└── ininParams 参数初始化
├── ReluLayer类
├── SoftMaxLayer类
├── SoftMaxLossLayer类
└── cross_entropy_error 计算交叉熵
├── ConvolutionLayer类
└── initParams 参数初始化
├── PoolingLayer类
├── DropOutLayer类
└── LayerFactory类
└── produce 根据神经网络层的名称和参数来构造类
├── drawer.py 结果绘制
└── Drawer类 数据可视化类
├── record 记录数据
└── plot 绘制数据
├── dataset.py 获取数据集并且split好
└── DataPreparer类 数据准备类
├── getData 加载数据并且划分测试集和训练集
└── get 外部获取数据接口
├── analyser.py 模型分析
└── Analyser类 模型分析类
└── analyse 分析函数
```
## 具体流程
1. 参数配置文件的加载
```python
with open(params_path) as params_file:
self.params = yaml.load((params_file))
```
这里使用了yaml文件作为配置文件,原因是yaml文件结构比较简单简洁,可以清楚地表示出层次结构,通过参数文件的配置,可以不用修改源代码就可以配置出不同的神经网络,具体见下面layer生成的分析
2. 加载数据集,分割训练集和测试集
使用sklearn 来获取数据集,并且进行分割
```python
# 加载数据
digits_data, digits_target = load_digits(
return_X_y=True)
# 划分训练集和测试集
self.x_train, self.x_test, self.y_train, self.y_test = \
train_test_split(digits_data, digits_target,
test_size=1-train_size_, train_size=train_size_,
random_state=3, shuffle=True)
```
3. layer的生成
```python
def produce(self, layer: str, params_set) -> object:
if params_set is None:
params_set = {}
return eval(layer)(**params_set)
```
这里利用eval动态生成构造信息,这样的话就可以根据配置文件的信息来动态生成类,也就是说网络选择哪些层,层的顺序是什么,只要符合一定的顺序(这个规则在yaml文件有写),就可以构造网络并且顺利运行,所得到的层使用OrderDict按顺序存储
4. 训练数据的提取
由于训练集数据并不多,如果仅仅利用这些数据训练的话,一定不够,所以采用了每次随机提取一个batch的数据的方案来进行训练,这样可以缓解数据集不足的问题
5. 参数初始化方法
- 由于使用Relu函数作为激活函数,故参数初始化统一使用He方法,Xavier方法可选
6. 神经网络的前向传播
根据 ConvolutionLayer -> ReluLayer -> PoolingLayer -> ConvolutionLayer -> ReluLayer -> PoolingLayer -> ConvolutionLayer -> ReluLayer -> DropOutLayer -> AffineLayer -> ReluLayer -> AffineLayer -> SoftMaxLossLayer 的顺序搭建网络,然后依次调用forward函数即可
- AffineLayer的前向传播
1. 由于传进的维度可能不是二维,所以首先要保存原来的维度信息,然后resize成二维矩阵
2. 根据矩阵的乘法以及加法来计算前向传播值
- ConvolutionLayer的前向传播
1. 将图像卷积转化为易于矩阵相乘的形式
2. 用相同与AffineLayer前向传播的方式计算
- ReluLayer的前向传播
1. mask标记出小于零的项,然后使这些项等于0
- PoolingLayer的前向传播
1. 利用im2col将4个数放在同一行(2*2池化核的情况下)
2. 计算每一行的最大值,保留最大值,其它全部删去,传播给下一层
3. 保存最大值的索引,方便反向传播
- DropOutLayer的前向传播
1. 训练模式下,删去部分神经元,即将参数设置为0,传播给下一层
2. 测试模式下,将每一个神经元参数下降一定比例
- SoftMaxLossLayer的前向传播
1. 利用SoftMax层进行计算,得到前向传播的最终结果
2. 对SoftMax层的计算结果利用交叉熵方法求loss
7. 神经网络的反向传播
- AffineLayer的反向传播
1. 根据矩阵乘法求取梯度(这里不具体分析原因,需要用到矩阵论的知识)
2. 矩阵乘法求取反向传播值,并且将值resize回原来的形状
- ConvolutionLayer的反向传播
1. 用同于计算AffineLayer反向传播的方法计算
2. 将结果用col2im还原为原来图片的形状
- ReluLayer的反向传播
1. 使原来小于零的项反向传播值也为0
- PoolingLayer的反向传播
1. 使前向传播最大值处的梯度值保留,其余处的梯度值变为0
2. 将矩阵使用col2im转化回原来的形式
- DropOutLayer的反向传播
1. 删除部分的神经元反向传播值为0
- SoftMaxLossLayer的前向传播
1. 公式 y-t 来进行计算
8. 神经网络
没有合适的资源?快使用搜索试试~ 我知道了~
Python课程设计—基于卷积神经网络手写数字识别系统.zip
共41个文件
sample:13个
py:8个
head:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 120 浏览量
2023-03-13
20:19:19
上传
评论
收藏 1.11MB ZIP 举报
温馨提示
Python课程设计—基于卷积神经网络手写数字识别系统.zip
资源推荐
资源详情
资源评论
收起资源包目录
Python课程设计—基于卷积神经网络手写数字识别系统.zip (41个子文件)
pic
loss.png 17KB
1.png 403KB
.keep 0B
hao.png 21KB
layer.py 12KB
save_params.pkl 119KB
network.py 5KB
dataset.py 1KB
.git
index 1KB
HEAD 23B
refs
heads
master 41B
remotes
origin
HEAD 32B
objects
pack
pack-3f81f8a0b35559c780c8702d4922672f2696f969.idx 2KB
pack-3f81f8a0b35559c780c8702d4922672f2696f969.pack 566KB
description 73B
packed-refs 114B
info
exclude 240B
logs
HEAD 190B
refs
heads
master 190B
remotes
origin
HEAD 190B
hooks
post-update.sample 189B
prepare-commit-msg.sample 1KB
commit-msg.sample 896B
pre-receive.sample 544B
update.sample 4KB
pre-commit.sample 2KB
pre-rebase.sample 5KB
applypatch-msg.sample 478B
fsmonitor-watchman.sample 5KB
push-to-checkout.sample 3KB
pre-applypatch.sample 424B
pre-push.sample 1KB
pre-merge-commit.sample 416B
config 310B
params.yaml 2KB
tools.py 2KB
drawer.py 634B
analyser.py 564B
method.py 2KB
README.md 10KB
optimizer.py 1KB
共 41 条
- 1
资源评论
oligaga
- 粉丝: 52
- 资源: 2万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功