卷积神经网络

一、绪论

1.卷积神经网络的应用

无处不在的卷积神经网路

分割、检测、分类、人脸识别、人脸表情识别、图像生成、图像风格转化、自动驾驶

2.传统神经网络vs卷积神经网络

深度学习三部曲

Step1.搭建神经网络结构

Step2.找到一个合适的损失函数

Step3.找到一个合适的优化函数,更新参数

损失函数

二、基本组成结构

1.卷积

什么是卷积,以及为什么需要二维卷积

基本概念

计算特征图大小

2.池化

池化类似于缩放

最大值池化和平均值池化

3.全连接

小结

三、卷积神经网络典型结构

神经网络发展历程

1.AlexNet

AlexNet成功的原因

Sigmoid和ReLU函数的优劣分析

DropOut(随机失活)函数分析:减小参数量

数据增强

AlexNet分层解析

第一次卷积

第二次卷积

后续几次卷积方式类似

全连接层

2.ZFNet

3.VGG

4.GoogleNet

参数小且没有全连接层

插入1*1卷积核降维,减少参数量

用两个3*3的卷积核的替代5*5的卷积核降低参数量

5.ResNet

残差思想

四、代码实战

Tensorflow-CNN

图片分类

卷积层,池化层(最大值池化),全连接层代码

五、结合pytorch代码讲解ResNet

网络退化现象

高层数的准确率可能会低于底层数的准确率

此时函数H(X)难以训练拟合,我们尝试训练F(X)=H(X)-X,如果F(X)可以训练,可以得到函数H(X)=F(X)+X,其中H(X)-X就是残差,这个训练过程就叫残差学习。

从传统VGG到ResNet,在层之间添加恒等映射

每个ResNet由五个stage组成,一个stage由若干个block组成,一个block由若干个convs组成

全局平均池化可以替代全连接层

减少参数,避免过拟合

50层以上的ResNet有三层block

50层以下的ResNet只有两层block

与BottleNeck相关

ResNet的新发展:

1.ResNeXt:引入了分组卷积

2.ResNeXt-Attention:注意力机制

3.ResNeXt WSL:弱监督训练

六、MNIST数据集分类

1.加载数据

值得注意的是,DataLoader是一个比较重要的类,提供的常用操作有:batch_size(每个batch的大小), shuffle(是否进行随机打乱顺序的操作), num_workers(加载数据的时候使用几个子进程)

input_size  = 28*28   # MNIST上的图像尺寸是 28x28
output_size = 10      # 类别为 0 到 9 的数字,因此为十类train_loader = torch.utils.data.DataLoader(datasets.MNIST('./data', train=True, download=True,transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])),batch_size=64, shuffle=True)test_loader = torch.utils.data.DataLoader(datasets.MNIST('./data', train=False, transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])),batch_size=1000, shuffle=True)

显示数据集中的部分图像

plt.figure(figsize=(8, 5))
for i in range(20):plt.subplot(4, 5, i + 1)image, _ = train_loader.dataset.__getitem__(i)plt.imshow(image.squeeze().numpy(),'gray')plt.axis('off');

2.创建网络

定义训练函数train和测试函数test

3.在小型全连接网络上训练

准确率略有波动 84%-88%

4.在卷积神经网络上训练

定义的CNN和全连接网络,拥有相同数量的模型参数

对比结果可以看出,相同的参数数量下CNN效果优于简单地全连接网络,原因是CNN能通过卷积和池化更好地挖掘图像中的信息。

5.打乱像素顺序再次在两个网络上训练与测试

考虑到CNN在卷积与池化上的优良特性,我们把图像中的像素打乱顺序,让卷积和池化难以发挥作用了。

加入data后重新定义测试与训练函数

在全连接网络上训练与测试

在卷积神经网络上训练与测试

通过测试结果可以看出,全连接网络准确率基本不受影响,卷积神经网络性能明显下降

这是由于像素的局部关系会影响卷积神经网络的准确度。

七、CIFAR10数据集分类

首先,加载并归一化 CIFAR10 使用 torchvision 。torchvision 数据集的输出是范围在[0,1]之间的 PILImage,我们将他们转换成归一化范围为[-1,1]之间的张量 Tensors。

下面代码中说的是 0.5,怎么就变化到[-1,1]之间了?

PyTorch源码中是这么写的:

input[channel] = (input[channel] - mean[channel]) / std[channel]

这样就是:((0,1)-0.5)/0.5=(-1,1)。

展示CIFAR10中的一部分图片

接着定义网络,损失函数和优化器

class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x# 网络放到GPU上
net = Net().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)

训练网络

从测试集中取出八张图片

把图片输入模型,查看CNN的识别效果

对比结果可知

与高老师的代码预期结果有差异,自身存在疑惑,多次运行后得到的结果都是两次识别结果完全一致 

高老师的结果

我的结果

接着查看CNN网络在整个数据集上的表现

准确率一般

八、使用VGG16对CIFAR10分类

定义dataloader

transform和dataloader定义不同,调用函数及参数各有不同

VGG中的定义

CNN中的定义

CIFAR10中的定义

VGG网络定义

经过高老师手动改参之后定义更美观对初始化网络,根据实际需要,修改分类层。因为 tiny-imagenet 是对200类图像分类,这里把输出修改为200。

关于这一行代码中的cfg有疑惑,自己实际运行时如果不加self.则无法顺利运行,跟高老师的代码存在不一样的地方,原因暂时未找到

之后进行网络训练

在关于Linear函数的参数设定上具有疑惑,在实际操作中如果设置成2048*10则会报错

mat1和mat2类型无法相乘分别是128*512和2048*10,需将2048*10改成128*512

测试验证正确率

根据结果可以明显看到,使用简化的vgg网络也大幅度提高了准确率

这周的学习到此就告一段落了,期待下周的学习

毕业设计第二周学习心得相关推荐

  1. 201671010117 2016-2017-2 《Java程序设计》Java第二周学习心得

    Java第二周学习心得 这一周老师在周四进行了课堂测验,完全出乎我的意料,我以为老师会在前两周上课讲一下,由于我在课前没有好好准备,反转课堂来的有的措手不及,那些题很多很多都不会,也错了很多,班上有很 ...

  2. Linux第二周学习笔记(7)

    Linux第二周学习笔记(7) 2.13 文档查看cat_more_less_head_tail (1). cat命令 cat命令:用于查看一个文件的内容并将其显示在屏幕上 cat-A命令:显示所有的 ...

  3. 机电传动控制第二周学习笔记

    机电传动控制第二周学习笔记 经过第二周的学习,我了解了电机的发展历史.从奥斯特发现电生磁的现象,到法拉第电磁回转实验,再到后来的电机一步步的发展至今.它充满了巧合,但是它又必然一步步向更完美走去.电机 ...

  4. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  5. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  6. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  7. 20155313 2016-2017-2 《Java程序设计》第二周学习总结

    20155313 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 1.1 基本类型 整数:可细分为short整数(占2字节).int整数(占4字节)与long ...

  8. Linux第二周学习笔记(5)

    Linux第二周学习笔记(5) 2.11.CP命令 cp(copy简写)命令:用来将一个或多个源文件或者目录复制到指定的目的文件或目录. cp –r:复制目录 -i:安全选项 cp命令:拷贝/etc/ ...

  9. 信息安全系统设计基础第二周学习总结

    信息安全系统设计基础第二周学习总结 学习目标 1. 熟悉Linux系统下的开发环境    2. 熟悉vi的基本操作    3. 熟悉gcc编译器的基本原理    4. 熟练使用gcc编译器的常用选项 ...

最新文章

  1. python爬取抖音评论_怎样用Python3爬取抖音神曲
  2. [转载]Windows Phone 系列- 本地数据存储
  3. Lync Server 2010的部署系列_第三章 证书、架构、DNS规划
  4. 2018年澳门就业情况理想 最新失业率维持1.7%
  5. html 输入框变红色,input输入框 输入错误时,点击注册按钮,输入框的边框变成红色,重新输入时,边框颜色恢复原来的,同时错误提示消失?...
  6. 处理字符串中的单个字符CharAt()
  7. 在idea中新建的text文件_开发属于自己的第一款 IDEA 插件!
  8. 怎么判断机械硬盘要多大_秋天要多吃芋头,买芋头是买大的还是小的?学学广西大妈怎么买...
  9. sqlserver如何启动数据库邮件
  10. 利用PLL IP核产生用户时钟
  11. 【Vue2.0】—事件处理和事件修饰符(二)
  12. 有人说“如今聪明的年轻人上班,愚蠢的年轻人创业!”对此大家怎么看?
  13. C# 通过PostMessage完成UI的更新
  14. 传智播客 C/C++学习笔记 野指针
  15. 天天生鲜页面设计——网站首页
  16. 吴恩达机器学习笔记目录
  17. 2016 server win 假死_Windows10出现假死的几种表现形式及对应解决方案
  18. CAD软件中怎么裁剪参照?
  19. thymeleaf 语法大全
  20. 电容式触摸感应技术原理之自容式触摸按键电极设计建议(1)

热门文章

  1. 计算机启动程序顺序,怎么设置电脑启动顺序图解
  2. Linux systemctl 详解自定义 systemd unit
  3. KUKA youbot机械臂与Moveit工具包(1)
  4. RHCE培训笔记之Vim的使用
  5. sda 在linux是什么意思
  6. windows10创意者完整镜像下载
  7. 20191021 设计图都不会画,还想做”架构师“?
  8. 帮你抢小游戏流量红利——快手小游戏入指南
  9. HTML实现九宫格延伸特效
  10. 北斗GPS校时服务器(卫星授时)应用于机场网络系统集成