> # ♻️ 资源
> **大小:** 861KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010918**](https://www.yuque.com/sxbn/ks/100010918)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87484809**](https://download.csdn.net/download/s1t16/87484809)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 一个简单的深度学习框架
## 概述
- 本项目是在完成南京大学神经网络课程大作业1时建立的.
- 这次作业要求设计一个神经网络拟合函数,![](https://cdn.nlark.com/yuque/__latex/3db60c65696fc17fd5e1ec88c9d7aba2.svg#card=math&code=y%253D%255Csin%28x_1%29-%255Ccos%28x_2%29%252C%2520%255Cqquad%2520x_1%252C%2520x_2%255Cin%255B-5%252C5%255D%250A&id=kCfKz) 且不允许使用现有的神经网络框架
- 基于以上原因, 参考网络上的资料实现了一个简单的深度学习框架, 此框架能够完成一些基本的深度学习任务
## 参考资料
- [joelgurs/autograd](https://github.com/joelgrus/autograd/tree/part06/autograd): 参考了此repo中关于tensor及其运算的实现
- [Automatic Differentiation Tutorial](https:_borgwang.github.io_dl_2019_09_15_autograd),
- [Build a Deep Learning Framework From Scratch](https:_borgwang.github.io_dl_2019_08_18_tinynn)
- 以及作者的repo [borgwang/tinynn-autograd](https://github.com/borgwang/tinynn-autograd). 参考了此repo中神经网络框架文件的组织结构
- [Python实现自动微分(Automatic Differentiation)](https://zhuanlan.zhihu.com/p/161635270)
- [啃一啃神经网络——权重初始化](https://zhuanlan.zhihu.com/p/102708578)
## 文件及运行方式说明
### 环境
- Python 3.7
- 依赖的库请通过以下命令安装
```
pip install -r requiremnets.txt
```
建议使用virtualenvwrapper创建一个虚拟环境然后按照依赖的库
### 框架文件
框架文件放置在mini_torch路径下
- tensor.py: Tensor类及其重载的操作
- layer.py: 网络层
- activation.py: 激活函数 (激活层)
- initializer.py: 权重初始化器
- network.py: 网络
- model.py: 包含权重更新器, 网络, 损失函数的网络模型
- optimizer.py: 权重更新器
- loss: 损失函数
- data_loader.py: 数据加载器
框架中方法的命名, 使用框架的方式模仿了 [Pytorch](https://pytorch.org/). 使用框架时请按需要import相关类或者函数
### 数据生成器
- data_generator.py: 生成训练, 测试数据. 可以设置数据数量, 文件导出位置等. 比如用以下命令生成5000条数据, 并按照4:1的比例划分训练集和测试集
```
python data_generator.py --num 5000 --ratio 0.8
```
用以下命令生成5000条测试数据
```
python data_generator.py --num 5000 --test
```
- 关于文件运行时参数的更多信息, 请参看代码文件
### 模型训练文件
- fit_func.py: 训练模型拟合函数并测试模型. 可以设置训练轮数, batch大小, 学习率等. 由于参数较多, 建议创建一个脚本来运行. 这里提供了一个脚本run.sh, 使用时只需在终端输入以下命令即可
```
./run.sh
```
- 如果采用提供的脚本执行, 请首先将以上两条命令都执行一遍
- 关于文件运行时参数的更多信息, 请参看代码文件
- utils.py: 包含用来绘图的函数
## 实现方法
### 框架的实现
- 自动求导:
- 神经网络的BP算法的关键在于反向传播, 反向传播通过链式法则对每个参数进行求导, 而自动求导可以让我们在搭建好一个神经网络后, 不再需要手动指定求导过程.
- 自动求导的基础是计算图, 下图是 ![](https://cdn.nlark.com/yuque/__latex/de3a93feb262d99bc4a998eae7e5d476.svg#card=math&code=f%28x_1%252C%2520x_2%29%253D%255Cln%28x_1%29%252Bx_1x_2-%255Csin%28x_2%29&id=DLtLe)的计算图
![](https://cdn.nlark.com/yuque/0/2024/jpg/2469055/1716963319512-b2b637cc-ef05-4434-a320-e552000810c0.jpg#averageHue=%23f7f7f7&from=url&id=wGjXL&originHeight=611&originWidth=1500&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
其中每个结点是中间计算的结果, 从左往右为正向计算函数, 从右往左为梯度方向传播的过程.
- 因此要实现自动求导, 就要在正向计算时记录下当前操作的导函数, 并把操作之间的依赖关系记录下来. 在求导时, 其实就是在计算图上用深度优先搜索 (DFS) 来传播梯度.
- 而要在正向计算时记录下导函数以及依赖关系, 就需要一种新的数据类型来描述操作的结果, 这种数据类型就是Tensor类, 并且通过重载它的操作, 完成正向计算的同时完成计算图的构建.
- 框架组件
- 实现了自动求导后, 就能在其基础上完成框架的搭建. 对于一个完整的神经网络模型, 如下图所示,
![](https://cdn.nlark.com/yuque/0/2024/jpg/2469055/1716963319714-853858b6-0a09-4256-bd02-82422b4c1077.jpg#averageHue=%23faf9f9&from=url&id=FcV2B&originHeight=572&originWidth=1068&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
可以把它拆分成layer (包括activation), network, optimizer, loss function这几部分, 其中network由layer构成, 一个model由network, optimizer, loss function构成. 此外, 再针对权重的初始化实现initializer, 以及加载数据的data_loader, 那么一个非常基础的神经网络框架就搭建好了, 就可以调用框架来搭建神经网络
### 搭建神经网络拟合函数
- 设计方案
- 采用了一个7层的神经网络, 每一层都是全连接层, 神经元数量分别为200, 100, 100, 80, 50, 30, 1.
- 隐藏层采用的激活函数是ReLU函数, 输出层不需要激活函数.
- 训练轮数为300轮, batch大小为64, 学习率为3e-4
- 效果展示
- 训练数据4000条, 测试数据1000条, 随机生成. 测试数据的作用是在训练过程中, 随训练过程动态可视化模型的拟合程度. 训练数据可视化后如下图所示
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716963319802-5ea5fc27-0406-47b1-9fab-731e902f7fe4.png#averageHue=%23f6f6f6&from=url&id=zG5se&originHeight=480&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
- 经过训练后, 在测试集上测试. 测试集本身的分布情况如下图所示
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716963319896-0890d215-6df4-4afb-9503-faa2c7c064b2.png#averageHue=%23f6f6f6&from=url&id=jLBA5&originHeight=480&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
使用模型拟合出的效果如下图所示
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716963319976-16f0216b-b0b1-4d93-bdf4-a98dd2d30b68.png#averageHue=%23f7f7f7&from=url&id=mJdxM&originHeight=480&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
可以直观看出, 该模型已经有较好的拟合能力, 平均误差如下图所示
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716963320047-b7855099-1fb2-4434-b466-f10cb7199906.png#averageHue=%232f2f26&from=url&id=b2pUh&originHeight=68&originWidth=260&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
### 训练时可能遇到的问题及改进方法
- 在某几次实验时, 发现该模型在拟合[-2, 2]区间, 即位于图中中间部分的最小值点附近区域时, 效果不太好, 往往不能下降到最低点.
- 此时一方面可
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010918 本项目是在完成神经网络课程大作业1时建立的. 这次作业要求设计一个神经网络拟合函数, $$y=\sin(x_1)-\cos(x_2), \qquad x_1, x_2\in[-5,5]$$ 且不允许使用现有的神经网络框架 基于以上原因, 参考网络上的资料实现了一个简单的深度学习框架, 此框架能够完成一些基本的深度学习任务
资源推荐
资源详情
资源评论
收起资源包目录
100010918-基于Python实现一个简单的深度学习框架.zip (23个子文件)
mini-torch
utils.py 479B
LICENSE 1KB
fit_func.py 7KB
data_generator.py 2KB
requirements.txt 43B
mini_torch
initializer.py 3KB
loss.py 1KB
layer.py 2KB
activation.py 2KB
network.py 766B
data_loader.py 1KB
model.py 3KB
tensor.py 11KB
optimizer.py 538B
run.sh 263B
images
test_dataset.png 182KB
p-1.png 3KB
test_1.png 158KB
train_dataset-1.png 177KB
train_dataset-2.png 187KB
compute_graph-1.jpg 103KB
structure.jpg 64KB
README.md 9KB
共 23 条
- 1
资源评论
神仙别闹
- 粉丝: 4138
- 资源: 7483
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- awewq1132323
- 手写流程图检测31-YOLO(v5至v8)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- frida拦截微信小程序云托管API
- 肝脏及其肿瘤分割的 CT 数据集,已经切片成jpg数据,约2w张数据和mask
- 基于Java的网上教务评教管理系统的设计与实现.doc
- 2024圣诞节海外消费市场趋势及营销策略分析报告
- JWaaaaaaaaaaaaaaaaaaaa
- Python实现常见排序算法详解
- 等发达地区的无穷大无穷大无穷大请问
- 微藻检测19-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功