使用numpy搭建自己的深度学习框架(零)

使用numpy搭建自己的深度学习框架


注:本系列搭建的深度学习框架名称叫numpyflow,缩写nf,用以熟悉目前主流的深度学习框架的基础和原理。本系列的目标是使用nf可以训练resnet。

开源地址:RanFeng/NumpyFlow

简介

本系列主要记录自己仅仅使用numpy来搭建自己的toy级别的深度学习框架。麻雀虽小,五脏俱全。在搭建自己的框架之前,我们要搞清楚我们需要准备些什么。

我们首先要知道,深度学习是啥、为啥叫深度学习。对于初学者,简单粗暴地理解:深度学习就是很多层的神经网络。很多很多层的神经网络搭建出来的模型很“深”,所以就叫深度学习。虽然听起来有点开玩笑的意思,但是大致就是这么回事。咱们暂时就这么理解没问题🤓。所以深度学习的基础就是神经网络,咱们只要把神经网络手动用numpy实现出来了,咱们就完成这个系列的任务了!🥳🥳🥳

好了,我们首先要手动实现一个神经网络,但是,神经网络是什么??这个问题比较基础,在此不作赘述,具体关于深度学习和神经网络的介绍,的可以参考我翻译的一篇国外博客1

第一个目标

假设你已经了解了神经网络、神经元等工作的原理【还不理解的记得看上面我说的翻译】。那也就理解了反向传播在神经网络中的重要性。
在这里插入图片描述
在这里插入图片描述
其实说到底,反向传播这东西也就是求解梯度的问题,相信大家对求解梯度都不会陌生,不理解的可以去翻看一下高数课本导数那章。

OK,那我们的第一个目标出现了,完成一个自动求解梯度的工具。因为深度学习过程中,你会遇到各种自定义的损失函数,如果不支持自动求解梯度的话,那难道要用户手动输入损失函数的导函数吗?咱看看那些tensorfuck、pytorch的框架,也都是自动求导解决一切的,没有让用户手动输入损失函数的导函数,当然那种不可导的情况除外。

第二个目标

现在继续假设,我们已经完成了自动求导,还需要什么呢?我们需要给框架内置一些神经层,比如全连接层、激活层、卷积层、池化层等等。这些层就是组成深度学习神经网络的基础。如果一个深度学习网络模型是一栋房子的话,这些层就是组成房子的砖块,用户使用砖块来搭建房子,所以我们必须要内置一些常用的砖块,啊不,神经层。对于那些特殊的层,或者用户自定义的层,咱们就不用实现了,毕竟还是要给用户一点自我发挥的空间的。

所以,第二个目标出现了,完成基本的神经网络层。

第三个目标

然后呢?完成了基本的神经网络层该做啥?接下来就是做优化器部分了,可能有小伙伴还不熟悉优化器是什么,这个我们先不详细展开,等描述到这部分再详细讲解,目前我们只需要知道,优化器是用来决定如何利用所求的梯度来优化神经网络层的参数的。

好的,在这三板斧之后,还有啥要做的?

没了。这个系列我们只做到这个地步,完成了这三个目标,一般的网络模型,比如resnet、VGG等网络模型,都可以用咱们这个numpyflow基本都能完成了。咱们这个框架也就有了基本的训练网络模型的能力了,可以毫不夸张的说,完成了这三部分,tensorflow或pytorch能做的事,其中80%我们都可以在numpyflow上完成,只是速度不及它们。剩下的20%咱们可以通过其他的补充来完成。当然,由于二八定律的存在,咱们这个系列就着重于这个三个目标了。

总结一下

使用numpy完成一个深度学习框架,咱们的粗略蓝图是:

  • 完成自动求导功能
  • 完成基本的神经网络层
  • 完成基本的优化器

深度学习框架所做的,基本就是优化神经网络层的参数。

而我们的三个目标中:
第一个,自动求导功能用来求解神经网络层参数的梯度,这些梯度指导着神经网络层的参数的更新方向。
第二个,基本的神经网络层用于搭建深度学习模型,他们每个层中的参数就是我们需要优化的东西。
第三个,优化器用于决定以何种方式来利用所求的梯度来优化神经网络层的参数。

下一站,带你们走进自动求导的世界!


  1. 翻译:深入理解神经网络中的数学 ↩︎

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值