本文是2019年4月《人工智能》专业课的大作业报告摘录
主要内容是在同一数据集(CIFAR10)上使用不同的卷积神经网络模型
进行多分类问题训练以及识别效果的横向评估
中文标题:基于不同神经网络的CIFAR10图像分类
项目地址
- 百度 AI Studio(需要登录AI Studio账号后访问,使用百度账号即可)
- 在AI Studio的“开发者共享项目”中搜索“CIFAR10图像”分类即可
- GitHub(待发布)
实验目的
基于百度AI Studio平台提供的paddlepaddle深度学习框架、Jupyter Notebook线上python运行环境等基础设施,编程实现包括VGG、ResNet、GoogleNet(Inception-V1)、Inception-V4等多种图像分类神经网络。在编程实现的过程中,学习深度神经网络的基本理论和实践要点,了解上述不同神经网络的具体结构设计以及体现出的优秀设计理念和不足之处。
使用平台提供的CIFAR10图像识别数据集,在相同的训练环境条件下,训练上述不同神经网络并得出数据模型。收集训练模型过程中输出的训练参数数据,绘制统计图表,比较分析不同神经网络模型的在训练过程中的性能开销、数据指标变化等特点。
通过统一的测试图像对训练得出的模型分类图像内容的准确性进行测试,从而比较分析不同神经网络模型在实际应用中的效果。
笔者注:根据最后的评估结果以及对相关论文、资料的研读,我们发现这种类似单一变量法的横向对比实验事实上是存在问题的:
不同年代的卷积神经网络模型,对于训练时最佳效果的硬件要求应该是不同的,虽然不排除存在出现轻量级框架的可能,但是主流意义上的框架对于硬件资源的需求的确是逐年上升的。不应当对每一种模型在训练过程中给出相同的硬件环境,而是给出文献或其开源代码所要求的最佳硬件环境。
因此,本次实验出现的较新版本的模型最终的识别效果较差的情况,事实上仅仅是实验平台的硬件条件不足以在短时间内训练得出最佳效果的模型。
实验仪器
- 本地设备:华硕K550-JX笔记本电脑、macOS Mojave 10.14.4
- 远程设备:百度AI Studio提供的通过Jupyter Notebook连接的CPU: 2 Cores 、Memory: 8GB的远程服务器(无GPU)
实验原理
实验项目概况
本次实验的基本框架来自于paddlepaddle官网教程中的《深度学习基础教程》的《图像分类》章节(网页链接:http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/basics/image_classification/index.html)。
该章节介绍了图像识别分类领域中包括VGG、ResNet和GoogleNet等常用模型的基本原理,并给出了paddlepaddle使用其框架自带的CIFAR10数据集以及VGG、ResNet训练模型并进行图像分类的基本步骤和代码实现。
我们在研读了该教程中的相关理论知识、各行代码实现的前提下,将该教程所述的数据预处理、训练模型、图像识别等完整的流程代码,移植到了同样搭载了最新版本的paddlepaddle的AI Studio在线项目环境中。该项目为新建的项目,而非直接fork在AI Studio上现有的项目,因此能够使用最新版本的paddlepaddle,避免了fork使用早期paddlepaddle版本项目所带来的一系列问题。
除此之外,我们也对代码进行了逐行的注释解读工作,来帮助使用者理解代码的基本含义和相关的理论知识。我们添加了训练过程中的数据统计图表绘制功能代码,能够在训练结束后将收集到的训练数据绘制成形象的图表并输出,有助于使用者对不同模型的性能进行综合的判断。
在此基础之上,我们更进一步,参考网络上的相关资料,将该教程中仅给出理论知识而无代码实践的GoogleNet(Inception-V1)、以及其同一系列的最新版本Inception-V4的模型代码移植实现到了百度AI Studio在线项目环境上(由于部分代码存在版本过低等问题,我们进行了相应的修改以确保代码能够正常运行),同样给出了详尽的代码注释解读。
现在,本项目已经公开在了百度AI Studio的“开发者共享项目”栏目中,欢迎大家fork本项目,也欢迎大家联系我们(邮箱:lmy98129@163.com)提出建议。
CIFAR数据集介绍
注:以下实验原理介绍部分摘录自paddlepaddle官方教程以及其他网络资料,同时也添加了我们在理论学习和实践过程中对于数据集使用、神经网络模型设计的优缺点等方面的思考和理解,能力有限,如有偏差,敬请谅解。
(图片摘自paddlepaddle官方教程)
CIFAR10数据集是主要用于通用图像分类而公开的标准数据集CIFAR的一个子集,包含60,000张32x32的彩色图片,10个类别(分别为:飞机airplane、轿车automobile、鸟类bird、猫cat、鹿deer、狗dog、蛙frog、马horse、船ship、卡车truck),每个类包含6,000张。其中50,000张图片作为训练集,10000张作为测试集。
之所以选用CIFAR而不是大量学术研究成果所基于的ImageNet,我们主要考虑到其体积的问题,在AI Studio的在线项目环境中使用的是CPU训练,而CPU的训练速度由于其核心数量、并行计算能力等原因一般要远远慢于GPU,因此选择一个较小的数据集能够较好地节省训练的时间,但也因此对模型的在小数据集条件下的训练效果提出了考验。
关于下载速度,由于AI Studio提供了可动态加载的数据集仓库,能够通过创建项目时进行设置、或者创建后修改项目设置等方式动态加载到项目中,因此不存在联网下载的问题。
VGG基本介绍
(图片摘自paddlepaddle官方教程)
相比以往的神经网络模型(例如CNN等),由牛津大学于2014年提出的VGG模型在神经网络的层数(深度)和卷积层的卷积核数目(宽度)上进行了增加。其核心结构是:五组不同卷积核数目的卷积层,以及每两组卷积层之间的max-pooling最大池化的降维操作,最后是全连接层和分类预测层。
关于VGG网络的设计,我们认为,加深神经网络能够进行更多次的特征提取,提高神经网络的表达能力,但是也增加了训练神经网络的时间和成本,过深的神经网络往往会因为带来梯度的损失而无法找到最优解,从而导致过拟合、准确度下降等一系列问题;加宽的神经网络能够输入更多的细节特征,但也导致了需要输入的参数过多,而同等深度下的神经网络,参数的个数对训练的结果没有明显的影响。
ResNet基本介绍
(图片摘自paddlepaddle官方教程)
为了解决随着网络层数加深而导致准确度下降的问题,ResNet提出了残差学习方法来减轻训练深层网络的困难,在添加batchnorm、小卷积核、全卷积网络等特性基础上,引入了残差模块。
残差模块的其中一条路径是输入特征的直连通道(可以认为是输入特征中的普遍特征),另一条经过多次卷积的到特征的残差(可以认为是输入特征中的显著特征),最后将以上两条结果相加得到输出。通过这种输出的叠加,残差模块很好地提升了深层次网络训练结果的准确度和收敛速度。
我们对于以上提到的一些现有特性概念的理解是:batchnorm能够将每次输入的数据分布进行规范化,让其均匀分布在当前层上,从而加速神经网络的训练速度、防止过拟合。小卷积核的意思是指单个卷积核的长宽尺寸减小,能够减少训练参数,从而降低训练模型的性能开销。全卷积网络是指整个模型的主体部分完全使用卷积网络,全连接层使用增加步长的特定卷积层替换,这种替换在功能上是等价的。
GoogleNet(Inception-V1)基本介绍
右图为添加1*1卷积层进行降维之后的模块
(图片摘自paddlepaddle官方教程)
GoogleNet由多组Inception模块组成,Inception模块的主要特点是在同一层级上并行设置了多个不同尺寸的卷积层和一个最大池化层,根据资料以及我们的理解总结,这一特性解决了多个问题:
- 卷积层的不同尺寸消除了信息分布的均匀程度对卷积核大小的选取影响
- 并行的卷积层减缓了网络层数过深导致的梯度损失以及过拟合
- 并行的最大池化层对输入尺寸进行压缩并提取主要特征,也缓解了简单堆叠多层网络导致的计算资源的消耗
但是这个特点同样带来了缺陷:并行的池化层并不会改变整个Inception模块的通道数量,并行卷积层构成的Inception在将各个并行层结果拼接后,特征的通道数较大,经过几层这样的模块堆积后,通道数会越来越大,导致参数和计算量也随之增大。因此,Inception还在每一个并行分支上引入了1*1卷积层进行降维操作,减少通道数,解决了这一问题。
除此之外,GoogleNet的另一个显著特征就是采用了三个子网络,可以得到3个网络的损失率进行加权求和得出整个网络的损失,从而有利于使用优化器(optimizer)的训练程序计算更准确的梯度,加快收敛速度。
Inception-V4基本介绍
(图片摘自论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》)
Inception-V4是Inception系列中的最新版本,经过V2版本添加batchnorm,V3版本对卷积层的调整,在Inception-V4中加入了同样基于卷积+池化并行理念的inception-sterm模块,并分化出了inception-A、B、C三种不同的模块类型。其设计的理念是要与添加了残差模块的Inception-ResNet具有相同的性能,因此使用了大量的经验性的结构设计,其对应的论文中没有对这些结构设计的由来做出进一步的解释说明。
此外,该模型还添加了reduction模块,起到了之前版本中的一层单层池化层的作用,同样采用了卷积+池化并行的结构设计。
实验内容与步骤
项目初始化
登录AI Studio平台
登录百度AI Studio首页并登录AI Studio账号,选择顶部导航栏中的“项目”,进入项目页面
创建项目
点击“创建项目”,输入项目名称、描述并添加数据集。在数据集添加界面中搜索并选中“cifar10数据集”。这里之所以选择这一项“cifar10数据集”是因为该数据集与在调用paddlepaddle自带的cifar10数据集时需要自动联网下载的cifar10数据集格式相同,可以在项目建立后通过在Jupyter Notebook中执行shell命令的方式,将数据集自行放入paddlepaddle的缓存目录中,节省其下载时间。
运行项目
创建项目之后,进入项目界面,点击“运行项目”,进入Jupyter Notebook界面
加载数据集
在第一个cell中输入将当前自动载入到项目当中的数据集cifar-10-python.tar.gz拷贝到paddlepaddle缓存目录的shell命令,如下所示
1 | !cp data/data5752/cifar-10-python.tar.gz /home/aistudio/.cache/paddle/dataset/cifar/cifar-10-python.tar.gz |
执行该cell,若得到如下输出,则拷贝成功。
至此,项目初始化完成。
编写项目主体代码
导入系统模块代码
1 | #导入paddle模块以及一些系统模块 |
如上所示,这些代码的主要导入了包括paddlepaddle、numpy、sys、math等运行环境内置的python库。
训练模型所需的模块函数
1 | # 预测程序 |
预测程序是在训练或预测过程中实际调用各神经网络模型的最底层函数,这里可以看到不同的模型要求输入的参数类型、调用方式都各有不同。这些模型的具体实现代码在下文会详细给出。
1 | # 训练程序 |
训练程序是在训练过程中通过模型返回的predict结果来计算损失率和预测精度的函数。这里特别处理了GoogleNet的三个损失率分量的加权求和计算。
1 | # 优化器程序 |
优化器程序是在训练过程中通过设置学习率、也就是训练的速度后返回一个特定的Adam优化器实例的函数,这是python类的用法。Adam优化器是优化器的一种,对梯度的一阶矩估计和二阶矩估计进行综合考虑,计算出当前神经网络中各个神经元的参数更新的步长,以加快梯度下降速度。Adam优化器在当前深度学习优化器中被默认是相当优异的
训练主函数
1 | # 训练主函数 |
训练主函数train相对较长,而且还内部声明了对训练结果进行损失率检测的train_test、训练循环函数train_loop几个函数,这里绘制了程序流程图以方便理解,如下图所示:
从代码和流程图中,我们可以看出训练主函数的主要工作是:
- 对训练进行一系列的函数调用关系的绑定、变量的声明和初始化以及训练所需的主要元器件实例(执行器、启动函数、主函数、优化器、数据集)的生成
- 进行实际训练过程中的执行、模型生成、数据生成
- 训练结束后图表的绘制
在这里需要说明的有以下几点:
在paddlepaddle中损失率为均方差函数得出的,故没有固定单位,但是一般在训练过程中是呈现总体下降的趋势,损失率越低,模型的效果越好。
准确度较容易理解,就是当前模型能够准确识别的样本个数占当前训练样本或测试样本的百分比。
batch_size是指每次训练时输入的样本个数,合理的batch_size设置能够减缓在训练过程中的损失率上下震荡的趋势,使得模型的损失率下降速度更快,精确率提升更加明显。根据经验,过大的batch_size可能会导致损失率下降或精确度提升到某一点后停滞,并且导致每次训练的时间和性能开销增大,过小的batch_size则会导致损失率上下震荡,下降速度减慢。
epoch是指所有样本完成一次前向运算和反向传播的次数,也就是所有样本都参与过训练的次数。epoch决定了整个训练的总时长,如果使用的是GPU,则可以因为并行处理性能高、训练速度较快而将epoch定在30~50甚至更多,而使用CPU则建议1~5,否则将导致训练时间过长,无法及时生成模型文件。
预测主函数
1 | # 预测主程序 |
程序主函数
1 | def main(use_cuda): |
程序主函数main的主要功能是先确定环境变量:使用CPU/GPU、当前使用的模型名称、模型文件保存路径等,再执行训练主函数和预测主函数,是整个程序的最顶层模块。
编写神经网络模型代码
注:由于在“实验原理”章节中,对于各神经网络模型的关键技术原理和关键模块结构已经进行了说明,此处代码部分对于这些内容不再重复解释。
在整体上,神经网络模型的实现主要是基于paddlepaddle提供的卷积层、池化层、全连接层等函数API以及层与层之间的连接来实现的,各神经网络的共性的地方在于以下2点:
- 经过若干个卷积、池化层结构之后,在最后输出结果之前的一层全连接层中都要经历一次softmax归一化,通过softmax归一化得到每个类别的概率,softmax能够将输入映射为0-1之间的实数,作为取到某个分类的概率,作为最终的输出结果。
- 在每一组神经网络之间,常用dropout层对结果按照一定概率随机丢弃一些特征,以防止过拟合;同时也常用batchnorm,将每次输入的数据分布进行规范化,让其均匀分布在当前层上,从而加速神经网络的训练速度、同样防止过拟合。
VGG模型
1 | # vgg模型定义 |
ResNet模型
1 | # resnet模型定义 |
GoogleNet模型
我们获得的初始GoogleNet模型代码使用的是早期的paddlepaddle版本,因此我们花费了一些时间查阅了paddlepaddle官网的API文档,研究了不同版本之间的API对应关系和调用方式上的差异。最终,我们成功地将该模型代码移植到了AI Studio在线项目平台上的paddlepaddle V1.4版本上。
1 | # googlenet模型定义 |
Inception-V4模型
1 | # inception_v4模型定义 |
训练和预测
为了能够更好地评价不同神经网络模型的训练性能、实际预测效果等,我们采用控制变量法,使用相同的训练和预测流程设计,训练使用的参数统一为batch_size=128、epoch=3,预测使用的待预测图像为一张狗的照片。运行程序、进行训练和预测的主要流程如下所示:
- 首先,我们需要保证项目之前的输出被全部清空,且在“Kernel操作”中进行过至少一次的“重启”操作。
- 之后,在最后一个cell的程序主函数中的model变量中确定对应模型的名称,若只需要使用已生成的模型文件进行预测而不需要再次训练,可以注释掉train训练主函数,只运行predict预测主函数。
- 最后,选中第一个cell,点击“Notebook操作”中的“运行当前及下方所有”,开始程序的运行。
各模型的具体运行结果截图可以参见下一章节“实验数据”。
实验数据
在训练和预测流程执行完毕后,对于各个模型程序输出的原始数据结果截图如下所示:
VGG模型
可能是由于最终训练结果的精确度过低,在预测过程中出现了报错的情况,因此此处没有预测结果。
ResNet模型
GoogleNet模型
Inception-V4模型
由于在理论上Inception-V4模型应当是GoogleNet(Inception-V1)的改进,但是首次训练和预测后的结果都完全差于GoogleNet,于是我们查询了该模型代码来源的GitHub仓库上的参数设置,发现batch_size应当由128改为256。
在针对该模型设置该特有参数值之后,我们进行了第二次的额外训练和预测。两次训练和预测的原始数据如下所示:
再次运行时的训练和预测结果
实验数据处理
VGG模型数据图表
由于在“实验数据”环节所述的程序报错的关系,未能够通过python代码自动生成损失率图表,此处使用Excel生成相关图表:
可以看出,VGG模型在当前训练环境下,训练过程中损失率震荡较大,下降速率较慢,准确率同样在上下波动且上升速率较慢,而使用测试数据集生成的测试数据基本保持不变。而且准确率相当低,在10%左右徘徊,说明VGG模型在当前环境下的综合性能较差。
ResNet模型数据图表
ResNet模型在当前训练环境下,训练过程中损失率震荡较小,下降速率在训练初期较快,之后趋于平缓。虽然测试过程中的损失率虽然震荡较大,但是参照训练过程,确实维持在一个合理的区间内。
在训练和测试过程中,ResNet模型的准确率都保持着不断升高的趋势,最终的准确率接近70%。
但是,在实际的预测过程中,ResNet模型却将带预测的图片分类为了horse马,说明在实际应用过程中,该模型仍存在可以提升的空间。
GoogleNet模型数据图表
GoogleNet模型在当前训练环境下,训练过程中损失率几乎没有震荡,下降速率在训练初期极快,之后趋于平缓且不断逼近0。测试过程中的损失率曲线与训练过程曲线近乎重合。以上现象说明了在当前环境下,该模型的训练效果相当出色。
在训练和测试过程中,GoogleNet模型的准确率都保持着不断升高的趋势,最终的准确率在60%左右。
除了下降速率曲线之外,该模型还有如下2点令人印象深刻之处:
- 训练速度快:相比其他模型,该模型的训练耗时相当少,当其他模型需要5~10秒才能训练完一个pass时,该模型只需1秒左右的时间,因此训练速度极快。我们认为训练速度快的主要原因是:该模型的网络层数相较于其他模型更少,且3个子网络分别输出损失率并加权求和的操作有助于优化器更加精确地计算出当前梯度,从而更准确地调整网络中各层神经元的权重参数。
- 模型实际预测结果精准:如下图所示,在实际预测的过程中,该模型是唯一一个将该图片正确分类为dog狗的,可以看出该模型在实际应用方面的准确度相当高,虽然数据层面的准确率60%略逊于ResNet的70%。
Inception-V4模型数据图表
Inception-V4模型在当前训练环境下,训练过程中损失率震荡严重,下降速率缓慢。测试过程中的损失率曲线与训练过程曲线同样近乎重合。以上现象说明了在当前环境下该模型训练效果较差。
在训练和测试过程中,Inception-V4模型的准确率都保持着不断升高的趋势,但是最终的准确率在30%左右。
在实际预测中,该模型将带预测图片分类为了truck卡车,说明其模型准确度确实不高。
我们在“实验数据”环节就已经根据程序输出的实验数据提出了“为何作为GoogleNet的迭代版本,Inception-V4反而在性能和实际效果上不如GoogleNet”的疑问并根据相关资料修改了batch_size为256,并进行了第二次的训练和预测。实验数据处理如下所示:
实验程序生成的Inception-V4的训练和测试损失率图表
Inception-V4的训练和测试准确率图表
可以看出,Inception-V4模型在修改参数后的训练环境下,训练过程中损失率震荡有所收敛,但下降速率依旧缓慢。测试过程中的损失率曲线与训练过程曲线同样近乎重合。以上现象说明了在当前环境下该模型训练效果仍然较差。
在训练和测试过程中,Inception-V4模型的准确率都保持着不断升高的趋势,但是最终的准确率还是在30%左右。
在实际预测中,该模型将带预测图片分类为了automobile轿车,说明其模型准确度仍然不高
GoogleNet模型实际预测结果
我们初步怀疑调整参数后效果仍然较差的原因有如下两点:
- epoch的次数仍然偏少,因为Inception_V4的网络层数明显多于GoogleNet,因此需要更长时间的训练才能够获得一个较好的模型,但由于使用CPU训练速度较慢,实验时间有限,暂时不考虑进行更多次的实验。
- 据Inception_V4对应的论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中的描述,该模型的设计主要考虑到了TensorFlow等框架在内存分配等方面的优化设计,因此也存在着paddlepaddle不支持这些特性导致的模型性能表现的不佳。
实验结果与分析
结果分析
针对在“实验数据处理”章节中对实验数据的图表绘制处理和初步分析,我们能够得出以下综合分析结果:
- 使用控制变量法在相同环境(尤其是采用相同参数)下的不同模型进行的性能评价结果,这一方法存在着很大的局限性。本次实验尤为突出的表现正是Inception系列的V1(GoogleNet)和V4之间的可以称之为逆转性的结果。在batch_size=128、epoch=3的条件下,V1在训练速度、训练数据展示的效果、实际预测效果上都优于V4。而出于对这一反常问题的好奇,我们将batch_size按照V4代码的初始来源处的参数改为了batch_size=256,结果效果改善程度有限。这些说明了控制变量法并不能够全面地衡量不同模型之间的性能和实际效果。
- 在当前环境下,GoogleNet和ResNet在各项实验数据指标上优于其他模型,而GoogleNet为最优。ResNet仅在准确率的数据层面上的70%略胜于GoogleNet的60%,而GoogleNet无论是在训练所需时间、损失率曲线的震荡程度、损失率曲线的下降速率、以及实际预测的准确程度都明显优于ResNet,且是唯一一个正确分类了带预测图片的模型。
- 但是这并不意味着Inception系列的Inception模块设计不存在缺陷,也并不意味着Inception系列不应该引入ResNet的结构设计,相反,ResNet的残差模块的结构设计在实际研究和应用过程中,确实有其“提升深层次网络训练结果的准确度和收敛速度”的独到之处。只不过由于实验时间的关系,我们并未继续引入Inception-ResNet-V1、Inception-ResNet-V2等两者相结合的模型,并进行进一步的实验和分析。
结论
实验结论
本次实验基于百度AI Stuido平台的在线项目平台,使用了包括VGG、ResNet、GoogleNet(Inception-V1)、Inception-V4等图像分类神经网络模型以及CIFAR10数据集,对相同环境条件下的不同模型在训练和预测过程中的性能开销、数据指标变化情况、实际预测情况等进行了详细的分析讨论。尽管通过实验表明,本次实验所使用的控制变量法存在着一定的局限性,但是本次实验仍然得出了GoogleNet(代表Inception系列)、ResNet在性能指标和实际效果上较为优秀的结论,这肯定了Inception模块、残差模块的结构设计在模型训练、实际预测等多方面相较于传统的多层神经网络存在着相当大的优势。
本次实验目的步骤明确、实验过程较为顺利、对实验结果的也进行了较为细致的处理和分析,是一次虽然存在问题,但在一定程度上较为成功的人工智能课程实验。
成果收获
经过本次实验,我们团队成员收获了以下成果:
- 通过研读paddlepaddle官方教程和文档以及其他网上相关资料、编写、移植以及逐行注释不同模型代码、处理分析实验数据等方式,我们锻炼了团队合作完成“查阅人工智能相关文献、理解相关基本概念、使用代码实现相应模型的结构设计、对实验数据进行处理和分析”的一整套人工智能领域研究流程的实战能力。
- 通过对paddlepaddle框架的学习,我们初步掌握了深度学习框架、以及其他辅助用途的python库的基本使用方式,了解了使用深度学习框架的需要进行的“数据处理、参数设置、模型训练、测试集测试、结果输出”等一般流程。
- 通过这次实验,我们也巩固了团队合作的情况下完成实验的任务分配、进度协调、成员沟通等综合能力。
待改进的地方
经过本次实验,我们认为仍然存在以下待改进的地方:
- 实验对不同模型的评估比较方法存在问题。控制单一变量法并不能够全面地让不同模型发挥出应有的性能效果,应当考虑给予不同模型以其目前研究水平下最佳的环境配置,通过基于单一测试数据的多次实际预测效果测试来衡量不同模型的性能,其结果会更好。
- 未能引入更多较为新型的图像分类模型例如Inception-ResNet系列模型等,进行范围更加广泛的比较和分析。
鸣谢
最后,在整篇文章的结尾,我还是要一如既往地感谢本次与我合作完成这一项目的搭档:Jet Lian,他主要负责本次项目的相关文献资料的查阅和汇总,VGG、ResNet、Inception-V4模型代码的编写、注释,实验程序执行和实验数据结果的处理、分析,“实验内容与步骤”之后的实验报告的撰写。
在他的合作之下,我才能够完成我自己的工作内容:实验方案选取、实验环境初始化、项目训练和预测函数等模块结构的搭建,基于paddlepaddle早期版本GoogleNet模型代码的移植、编写和注释,“实验内容与步骤”及之前的实验报告撰写。
作为室友兼搭档,我个人是十分敬佩他分析问题、解决问题和实际编码的强大综合能力的,像他这样成绩优秀且技术能力过硬的同学,在USTB的CS专业中乃至SCCE学院中都是罕见的。真的十分荣幸,能够在这三年的时光中与他为友,在技术成长的道路上并肩前行。
同时,我也十分感谢《人工智能》专业选修课的任课老师王睿老师、以及本次和AI专选课合作的百度AI Studio在线实验平台,正是老师和工作人员们的通力合作和不懈努力,为我们本届CS学生创造了一次实际体验深度学习训练到预测全过程的宝贵机会。希望这样的机会在未来的SCCE学院乃至整个行业会越来越多,再次感谢这些为技术知识的传播做出贡献的人们!
参考资料
- 百度paddlepaddle官网教程《深度学习基础教程》的《图像分类》章节:
http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/basics/image_classification/index.html - 基于paddlepaddle的inception-v4模型代码:
https://github.com/PaddlePaddle/models/blob/43cdafbb97e52e6d93cc5bbdc6e7486f27665fc8/PaddleCV/image_classification/models/inception_v4.py - 基于paddlepaddle旧版的googlenet模型(本文中展示的是基于该项目移植到新版paddlepaddle后的代码):
https://www.cnblogs.com/charlotte77/p/8066867.html - Google Inception系列论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》:
https://www.aaai.org/ocs/index.php/AAAI/AAAI17/paper/viewPDFInterstitial/14806/14311