当前位置:首页|资讯|编程|机器学习|深度学习|人工智能

我找到了AlexNet当年的源代码,没用框架,从零手撸CUDA/C++

作者:人工智能大讲堂发布时间:2024-06-03

2012年,对人工智能来说是不平凡的一年,AlexNet赢得了当年的ImgeNet挑战赛,这件在当时看似平常的事却引起了全世界的关注,因为它是第一个赢得该赛事的神经网络模型,从此,人工智能开始由传统机器学习向深度学习过渡。



AlexNet赢得挑战赛后,辛顿和另两位作者立刻成立了DNN Research Inc,并最终以4400万美元的价格拍卖给谷歌。除了谷歌,其它所有的科技公司也都加入到了这场科技界的军备竞赛中,包括远在大洋彼岸的百度,它是这次竞拍的主要发起人。

严格意义上讲,AlexNet并不是第一个神经网络模型,而是Yann LeCun在1998年提出的LeNet,但当时由于算力不足和缺少数据,所以并没有得到广泛应用,在AlexNet赢得比赛后,Yann LeCun也是连夜开会进行复盘总结(为什么不是LeNet?)。虽然LeNet没有成为第一个受到关注的神经网络模型,鉴于他的贡献,Yann LeCun和辛顿后来都被授予了图灵奖。

12年后的今天,深度学习已经成为主流,神经网络在CV,NLP等领域得到广泛应用,CNN和Transformer模型架构也是遍地开花,更幸运的是,我们在开发AI应用过程中,到处都是好用的工具和框架,但这有时也成了一种幸福的烦恼。

各种算子是如何实现?

数据是如何组织?
计算是如何并行化?

主机和GPU如何传输数据?

反向传播怎么计算梯度?

我们对这些细节知之甚少。

在2012年,AlexNet可没那么幸运,当时没有任何成熟的深度学习框架可用于模型训练或者推理。一切只能从零开始,我们在AlexNet另一个作者Alex Krizhevsky主页上找到了AlexNet的源代码,作者使用CUDA/C++从零开始实现模型训练和推理过程。

项目主页:https://code.google.com/archive/p/cuda-convnet/

源代码:https://github.com/ulrichstern/cuda-convnet


这份代码为我们学习神经网络背后的原理提供了一个捷径。

项目主要由Python和C++代码组成,Python用于组织和处理数据,C++则实现了各种算子、网络结构、前向计算和反向传播以及调用CUDA进行并行计算。并通过Python/C API实现C++代码操作Python对象。

定义网络结构

AlexNet通过配置文件构造网络结构,配置文件中每一个[]都代表网络结构中的一层,data代表输入层,conv代表卷积层,pool代表池化层,fc代表全连接层,每一层通过后面的配置项指定了输入、输出等属性。neuron指定激活函数。

在源代码中采用C++面向对象的思想,每一个概念都对应一个类。

编译

训练

代码编译完成后,通过下面代码就可以开始模型训练。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1