程序依赖
pyyaml
numpy
sklearn
matplotlib
abc
选题
利用numpy完成手写数字数据集的识别,完成多分类问题,搭建神经网络,并且完成模型的训练以及性能评估,可视化数据
用到的知识
sklearn 数据集的提取分割
yaml配置文件使用
numpy实现各个神经层
参数初值选择
梯度下降方法选择
sklearn 分类模型评估
matplotlib数据可视化
设计模式
Markdown写报告
防脱发技术
框架
整体框架
框架
代码框架
.
├── 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 分析函数
具体流程
参数配置文件的加载
with open(params_path) as params_file:
self.params = yaml.load((params_file))
这里使用了yaml文件作为配置文件,原因是yaml文件结构比较简单简洁,可以清楚地表示出层次结构,通过参数文件的配置,可以不用修改源代码就可以配置出不同的神经网络,具体见下面layer生成的分析
加载数据集,分割训练集和测试集
使用sklearn 来获取数据集,并且进行分割
# 加载数据
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)
layer的生成
def produce(self, layer: str, params_set) -> object:
if params_set is None:
params_set = {}
return eval(layer)(**params_set)
这里利用eval动态生成构造信息,这样的话就可以根据配置文件的信息来动态生成类,也就是说网络选择哪些层,层的顺序是什么,只要符合一定的顺序(这个规则在yaml文件有写),就可以构造网络并且顺利运行,所得到的层使用OrderDict按顺序存储
训练数据的提取
由于训练集数据并不多,如果仅仅利用这些数据训练的话,一定不够,所以采用了每次随机提取一个batch的数据的方案来进行训练,这样可以缓解数据集不足的问题
参数初始化方法
由于使用Relu函数作为激活函数,故参数初始化统一使用He方法,Xavier方法可选
神经网络的前向传播
根据 ConvolutionLayer -> ReluLayer -> PoolingLayer -> ConvolutionLayer -> ReluLayer -> PoolingLayer -> ConvolutionLayer -> ReluLayer -> DropOutLayer -> AffineLayer -> ReluLayer -> AffineLayer -> SoftMaxLossLayer 的顺序搭建网络,然后依次调用forward函数即可
AffineLayer的前向传播
由于传进的维度可能不是二维,所以首先要保存原来的维度信息,然后resize成二维矩阵
根据矩阵的乘法以及加法来计算前向传播值
ConvolutionLayer的前向传播
将图像卷积转化为易于矩阵相乘的形式
用相同与AffineLayer前向传播的方式计算
ReluLayer的前向传播
mask标记出小于零的项,然后使这些项等于0
PoolingLayer的前向传播
利用im2col将4个数放在同一行(2*2池化核的情况下)
计算每一行的最大值,保留最大值,其它全部删去,传播给下一层
保存最大值的索引,方便反向传播
DropOutLayer的前向传播
训练模式下,删去部分神经元,即将参数设置为0,传播给下一层
测试模式下,将每一个神经元参数下降一定比例
SoftMaxLossLayer的前向传播
利用SoftMax层进行计算,得到前向传播的最终结果
对SoftMax层的计算结果利用交叉熵方法求loss
神经网络的反向传播
AffineLayer的反向传播
根据矩阵乘法求取梯度(这里不具体分析原因,需要用到矩阵论的知识)
矩阵乘法求取反向传播值,并且将值resize回原来的形状
ConvolutionLayer的反向传播
用同于计算AffineLayer反向传播的方法计算
将结果用col2im还原为原来图片的形状
ReluLayer的反向传播
使原来小于零的项反向传播值也为0
PoolingLayer的反向传播
使前向传播最大值处的梯度值保留,其余处的梯度值变为0
将矩阵使用col2im转化回原来的形式
DropOutLayer的反向传播
删除部分的神经元反向传播值为0
SoftMaxLossLayer的前向传播
公式 y-t 来进行计算
神经网络的参数更新
通过反向传播之后,我们获得了AffineLayer和ConvolutionLayer的梯度值,于是可以根据这些梯度值对参数进行更新,更新方法有两种可选:
随机梯度下降法,学习率恒定
AdaGrad:学习率会根据之前梯度的平方和来逐渐削弱
模型测试
x_test = self.x_test.reshape(-1, 1, 8, 8)
x_predict = self.predict(x_test)
predict_y = np.argmax(x_predict, axis=1)
参数保存
通过调用每一层的saveParams()函数,
没有合适的资源?快使用搜索试试~ 我知道了~
Python课程设计-基于卷积神经网络手写数字识别系统.zip
共17个文件
py:8个
png:3个
pkl:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 10 下载量 149 浏览量
2022-06-23
16:16:07
上传
评论 15
收藏 559KB ZIP 举报
温馨提示
Python课程设计—基于卷积神经网络手写数字识别系统,经老师指导通过的高分项目。 选题 利用numpy完成手写数字数据集的识别,完成多分类问题,搭建神经网络,并且完成模型的训练以及性能评估,可视化数据 用到的知识 sklearn 数据集的提取分割 yaml配置文件使用 numpy实现各个神经层 参数初值选择 梯度下降方法选择 sklearn 分类模型评估 matplotlib数据可视化 设计模式 Markdown写报告
资源推荐
资源详情
资源评论
收起资源包目录
卷积神经网络手写数字识别.zip (17个子文件)
1
NeturalNetwork-master
README.txt 12KB
layer.py 12KB
tools.py 2KB
pic
1.png 403KB
hao.png 21KB
.keep 0B
loss.png 17KB
drawer.py 609B
dataset.py 1KB
analyser.py 545B
params.yaml 2KB
LICENSE 743B
.gitignore 2KB
save_params.pkl 119KB
method.py 2KB
network.py 5KB
optimizer.py 1KB
共 17 条
- 1
程序员张小妍
- 粉丝: 1w+
- 资源: 2788
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页