其他
【他山之石】从NumPy开始实现一个支持Auto-grad的CNN框架
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
地址:https://www.zhihu.com/people/maxwell-21-7
框架设计
Tensor
data: 数据真正的存储位置,使用的是NumPy的ndarray类; grad: 用于保存梯度,类型和data一致; requires_grad: 标志符,Tensor是否需要梯度; retain: 标志符,在计算图释放时是否释放自身
Function
forward: 前向计算函数,静态函数(原因后面会提到); backward: 反向计算函数,静态函数.
如果实现为非静态方法,即不需要ctx参数,而是将中间变量保存在self.xxx中,那么每需要计算一次除法,就要创建一个新的_Div_类实例; 而实现为静态方法后,仅需要全局创建一个除法Function实例,每次需要时调用即可。
FunctionAuto-grad的实现
tensors: Tensor池,所有创建的Tensor都会被记录到其中,用C++的说法就是保存了指向Tensor的指针; funcs: Function池,所有调用的Function都会被记录到其中,注意这和Tensor池不一样,并不记录创建而是记录调用; blind: 标志符,用于控制tracer是否记录梯度.
# 导入模块
>>> import numpy as np
>>> import pico.functional as F
>>> from pico.base import Tensor
# 创建 Tensor A 和 Tensor B
>>> A = Tensor(np.array([2.5]), requires_grad=True)
>>> B = Tensor(np.array([0.5]), requires_grad=True)
# 计算 A / B
>>> O = A/B
# 输出 O
>>> print(O)
Tensor([5.], requires_grad=True)
# O分别对A, B计算梯度
>>> O.backward()
# 输出梯度
>>> print(A.grad)
[2.]
>>> print(B.grad)
[-10.]
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“他山之石”历史文章
pytorch_lightning 全程笔记
深度学习中的那些Trade-off
PyTorch 手把手搭建神经网络 (MNIST)
autograd源码剖析
怎样才能让你的模型更加高效运行?
来自日本程序员的纯C++深度学习库tiny-dnn
MMTracking: OpenMMLab 一体化视频目标感知平台
深度学习和机器视觉top组都在研究什么
pytorch常见的坑汇总
pytorch 中张量基本操作
pytorch计算模型FLOPs和Params
保姆级教程:个人深度学习工作站配置指南
整理 Deep Learning 调参 tricks
Tensorflow模型保存方式大汇总
更多他山之石专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!