跟着刘二大人学pytorch(第---10---节课之卷积神经网络)

发布于:2024-06-17 ⋅ 阅读:(50) ⋅ 点赞:(0)

0 前言

0.1 课程链接:

《PyTorch深度学习实践》完结合集
有大佬已经写好了笔记:大佬的笔记
pytorch=0.4

0.2 课件下载地址:

链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu
在这里插入图片描述

回忆

全连接
在这里插入图片描述
通道×宽×高
如果按全连接的话就破坏了原来的空间信息
下采样:通道数不变,目的是减少数据量,降低运算

构建一个神经网络之前首先考虑输入的张量的维度是什么,输出的张量维度是什么,使得卷积神经网络顺利先跑起来。

所有的卷积层+下采样合起来被称为:特征提取器(Feature Extraction),即找出某种特征。

接下来介绍卷积、下采样
通过下图直观的认识这两个东西
在这里插入图片描述

卷积

讲解卷积之前,先讨论一下图像是什么

在计算机领域遇到的图像都称为RGB图像,要表示一个像素,图片被分成一个一个单元格子,每个格子有一个颜色值,这样就构成一个图像,这样的图像被称为栅格图像,相机、显微镜在处理图像时
中学时学的一个东西叫光敏电阻,该电阻可以根据光照电阻发生变化.
通过多个个光敏电阻,做成一个阵列,每个光阻通过光阻都可以反映一个范围内的光的强度,通过光的强度与电阻之间的对应关系关系,可以画出阵列所反映的图,由电阻值转变为光的强度值,该图即为黑白图。
在这里插入图片描述
像素为2×2
光阻放的越多,得到的图片的像素越大,有的手机虚表像素值,是因为将没有的像素进行了插值,取临近的一些像素值的平均值,
1)红色传感器对红色波段比较敏感,R,红色传感器中的电阻值可以反应灰度级别,即到底有多红,用0-255中的值来定义灰度的级别,以下类似
2)蓝色传感器对蓝色波段比较敏感,G
3)绿色传感器对绿色波段比较敏感,B
由上即可将光阻值转变为彩色图像
下面的额小方格就是由红绿蓝传感器组成的阵列
在这里插入图片描述
因此我们遇到的图片一般是栅格图像,还有一类图像是矢量图,这种图描述方式不和栅格图像一样。
描述矢量图是描述圆心、直径、边是什么颜色,填充什么颜色(不重要)
拿到一个图像将使用三个通道来表示
图像的坐标系的介绍见我的另一篇文章:
在这里插入图片描述

卷积过程(以输入为单通道、1个卷积核为例)

数乘:对应元素想 乘
在这里插入图片描述
在这里插入图片描述

卷积过程(以输入为3通道、1个卷积核为例)

每一个通道配一个核,通道数=核的数量
在这里插入图片描述

上面画出来的三个红色的小方块儿对应为图像中的一个patch。
图像的一个patch与一个卷积核先数乘再相加,即下面红色框出来的大方框操作称为卷积
在这里插入图片描述
见下图
在这里插入图片描述
进一步表示:
在这里插入图片描述

卷积过程(以输入为N通道、1个卷积核为例)

在这里插入图片描述
上图中,一个卷积可以得到一个最终的通道为1的结果,如果再使用一个卷积核就可以得到另外一个通道为1的结果,以此延

卷积过程(以输入为N通道、M个卷积核为例)

在这里插入图片描述
由上图发现:
1)卷积核的个数和输入的通道数是一样的(这一句应该是写错了,应修改为:卷积核的通道数和输入的图片的通道数是一样的)
2)输出的通道数和卷积核的总个数是一样的(因此只要看到输出是多少个通道,上一步的卷积就有多少个卷积核)
在这里插入图片描述
由上图知:可以将m个卷积核可以拼成一个4维的张量
定义一个卷积层只需要关系4个值:
1、输入的通道数:决定了卷积核的通道数
2、输出的通道:决定了使用了多少个卷积核
3、卷积核的大小(宽和高):这个是必须的
卷积层的定义和输入图像的大小无关
在这里插入图片描述

Padding

在这里插入图片描述

Padding(padding=1)

在这里插入图片描述
torch.nn.Conv2d(输入的通道数,输出的通道数,kernel_size,padding,bias=False)
bias是偏置量
conv_layer.weight.data = kernel.data就是将定义的卷积核的张量数值给卷积层的权重
在这里插入图片描述

步长stride(stride=2)

在这里插入图片描述
通过以上的代码得到上面的结果
在这里插入图片描述

下采样(Max Pooling Layer)

这一层没有权重,通道数不会变
例如一个2×2的max pooling,则默认步长为2,
在这里插入图片描述
通过以下的代码得到上面的结果在这里插入图片描述

一个简单的例子

在这里插入图片描述
用卷积、池化来代替之前的全连接
在这里插入图片描述
在这里插入图片描述
最后接的是交叉熵损失,所以不做激活

如果有GPU的话,代码如何改

1)模型迁移到GPU
cuda:0,表示使用第一块显卡,cuda:1表示使用第二块显卡
在这里插入图片描述
model.to(device):指的是将模型的参数、缓存、所有的模块,都放到cuda里面,都转成相应的tensor,所有涉及的权重都放进显卡里面,此时将把之前在cpu上定义模型、权重全部迁移到GPU上面
在这里插入图片描述
2)计算时把数据迁移到GPU
把要计算的张量迁移到GPU上面,主要是输入和输出
注意要将数据迁移到的显卡要和模型所要迁移的显卡要一致
训练部分需要加
在这里插入图片描述
测试部分也需要加上
在这里插入图片描述

结果

在这里插入图片描述

作业

在这里插入图片描述
比较不同配置对应的网络的性能。