CNN高级实训报告

任务描述

首先学习CNN,在对CNN和深度学习有足够了解后,选择任务题材。
我选择的是AlexNet和resnet模型做图像分类。框架统一采用TensorFlow,数据集我选择MNIST手写体数据集。

准备工作

主要包括对TensorFlow的安装和对数据集的下载。

安装TensorFlow

方法一:直接安装

使用python,用如下指令即可。
在这里插入图片描述
缺点:不能选择版本,TensorFlow 2和TensorFlow 1的兼容性较差。且这种方法安装的TensorFlow不全。

方法二:去GitHub的TensorFlow首页下载安装。
在这里插入图片描述
方法三:用Anaconda安装

1.安装 Anaconda
2.建立一个 conda 计算环境
3.激活环境,使用 conda 安装 TensorFlow
4.安装成功后,每次使用 TensorFlow 的时候需要激活 conda 环境
优点:可以选择版本,对其他未安装的依赖库,不容易出错。

安装数据集

方法一:去网上下载

想找到免费的下载链接并不容易,这里提供一个。
下载链接,解压码:wa9p

方法二:用代码下载

MNIST手写数据集已经作为典型样本,被TensorFlow收集,可以通过TensorFlow库里自带的教程函数进行下载。
在这里插入图片描述
如果没有数据集,就自动从网络获取数据集,解压并赋值给mnist变量。

但是通常安装的TensorFlow并不自带教程库函数,因此需要在其他地方下载tensorflow.examples.tutorials文件夹,并放入TensorFlow库的目录中。

结果:

下载后有四个数据集,分别是训练集的图片和标签,测试集的图片和标签:
在这里插入图片描述

开始任务

代码见这里

AlexNet

论文原文在这里

论文中提出的AlexNet网络结构如下图:
在这里插入图片描述
总共经过9层,最终得出结果。每层都分为上下两部分,因为原文中使用了两个GPU做实验的,每个GPU负责一半,这会使运算速率增大,但是如果不用GPU也没问题,在一个CPU上运算不会影响结果。

第一层:输入。输入图像是2252253,期中225*225是像素尺寸,3是颜色,RGB中一个颜色用三个数字表示,这里把RGB分开成三维,进行单独运算。

第二层:求卷积。在图中,生成了555548的数据空间两个。对2252253的图像,以11113大小的卷积核进行求卷积操作,步长为4,可以得出一个5555的数据。而这一步中,需要用96个卷积核对数据进行处理,所以得出的答案是555596,由于分散在两个GPU上,所以上图得出两个5555*48的数据。然后做归一化操作,池化操作,dropout操作。得出结果。
在这里插入图片描述

其中第四行为dropout操作,作用是防止过拟合问题。

第三层:把第二层的结果作为输入,以同样的操作,用256个卷积核做运算,然后归一化,池化,dropout。

第四五六层:同上,变化的只是卷积核数量,卷积核尺寸和步长。

第七八层:全连接层,每一层的神经元的个数为4096,最终输出softmax为1000。因为论文参加的ImageNet比赛数据集总共有1000类,所以输出1000维结果。全连接层中使用了RELU和Dropout。

运行结果:

当运行5轮时:
在这里插入图片描述

10轮时:
在这里插入图片描述

20轮时:
在这里插入图片描述

可以看出,每一轮的cost逐渐变小,随着轮数量的增加,准确率也上升,如果轮数足够大,准确率会变得很高。
(至少要50轮以上,才可靠,我的电脑没那么多时间跑。)

Resnet

传统的深度学习网络,存在传递信息的时候会出现信息的损耗或者丢失,在很深的神经网络中,还会出现梯度消失或者梯度爆炸,因此而提出了Resnet网络,提出了残差学习的概念。
在网络中增加了许多直连通道,直连通道允许信息绕道传输,绕过一些层,直接通往更深层,保护了信息的完整性,而整个网络只需要学习输入输出差别的那一部分,称为残差,简化了学习的目标和难度。
Resnet的信息传递途径并不总是线性的,顺序的。如下图:
在这里插入图片描述
Resnet的基本结构由残差块构成:
在这里插入图片描述
一个残差块有2条路径F(x)和x,F(x)路径拟合残差,不妨称之为残差路径,x路径为恒等映射,称之为”shortcut”。图中的oplus为element-wise addition,要求参与运算的F(x)和x的尺寸要相同。

如下可构建一个3层的残差块
在这里插入图片描述

ResNet结构非常容易修改和扩展,通过调整block内的channel数量以及堆叠的block数量,就可以很容易地调整网络的宽度和深度,来得到不同表达能力的网络,而不用过多地担心网络的“退化”问题,只要训练数据足够,逐步加深网络,就可以获得更好的性能表现。

输出结果:
1234这样的单行数字是为了显示进行进度,因为速度过慢,无法确定是不是死了。

训练1个周期:
在这里插入图片描述
训练3个周期:
在这里插入图片描述

训练5个周期:
在这里插入图片描述
可见周期越多,准确率越大。

如果对比的来看,在训练相同周期数量的情况下,Resnet的准确率比Alexnet高,但是与之相对Resnet的单轮运行时间,比Alexnet长。可能是因为Resnet的训练深度更深,模型层数更多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值