动手学习深度学习-学习笔记

1数据操作

1.1概念

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2数据操作实现

首先,我们导入torch。请注意,虽然它被称为PyTorch,但是代码中使用torch而不是pytorch。

import torch

张量表示由一个数值组成的数组,这个数组可能有多个维度。 具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix); 具有两个轴以上的张量没有特殊的数学名称
首先,我们可以使用 arange 创建一个行向量 x。这个行向量包含以0开始的前12个整数,它们默认创建为整数。也可指定创建类型为浮点数。张量中的每个值都称为张量的 元素(element)。例如,张量 x 中有 12 个元素。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。

x = torch.arange(12)
x

tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状 。

x.shape

torch.Size([12])

如果只想知道张量中元素的总数,即形状的所有元素乘积,可以检查它的大小(size)。 因为这里在处理的是一个向量,所以它的shape与它的size相同。

x.numel()

12

要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。 例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵。 这个新的张量包含与转换前相同的值,但是它被看成一个3行4列的矩阵。 要重点说明一下,虽然张量的形状发生了改变,但其元素值并没有变。 注意,通过改变张量的形状,张量的大小不会改变。

X = x.reshape(3, 4)
X

tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

我们不需要通过手动指定每个维度来改变形状。 也就是说,如果我们的目标形状是(高度,宽度), 那么在知道宽度后,高度会被自动计算得出,不必我们自己做除法。 在上面的例子中,为了获得一个3行的矩阵,我们手动指定了它有3行和4列。 幸运的是,我们可以通过-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)。

有时,我们希望使用全0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。 我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为0。代码如下:

torch.zeros((2, 3, 4))

tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],

    [[0., 0., 0., 0.],
     [0., 0., 0., 0.],
     [0., 0., 0., 0.]]])

同样,我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1。代码如下:

torch.ones((2, 3, 4))

tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],

    [[1., 1., 1., 1.],
     [1., 1., 1., 1.],
     [1., 1., 1., 1.]]])

有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。 例如,当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。 以下代码创建一个形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。

torch.randn(3, 4)

tensor([[-0.5582, -0.0443, 1.6146, 0.6003],
[-1.7652, 1.3074, 0.5233, 1.4372],
[ 0.2452, 2.2281, 1.3483, 0.1783]])

我们还可以通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。 在这里,最外层的列表对应于轴0,内层的列表对应于轴1。

torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

tensor([[2, 1, 4, 3],
[1, 2, 3, 4],
[4, 3, 2, 1]])

1.2.1运算符

在这里插入图片描述

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # **运算符是求幂运算

(tensor([ 3., 4., 6., 10.]),
tensor([-1., 0., 2., 6.]),
tensor([ 2., 4., 8., 16.]),
tensor([0.5000, 1.0000, 2.0000, 4.0000]),
tensor([ 1., 4., 16., 64.]))

“按元素”方式可以应用更多的计算,包括像求幂这样的一元运算符。

torch.exp(x)

tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

在这里插入图片描述

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 2., 1., 4., 3.],
[ 1., 2., 3., 4.],
[ 4., 3., 2., 1.]]),
tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
[ 4., 5., 6., 7., 1., 2., 3., 4.],
[ 8., 9., 10., 11., 4., 3., 2., 1.]]))

有时,我们想通过逻辑运算符构建二元张量。 以X == Y为例: 对于每个位置,如果X和Y在该位置相等,则新张量中相应项的值为1。 这意味着逻辑语句X == Y在该位置处为真,否则该位置为0。

X == Y

tensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])

对张量中的所有元素进行求和,会产生一个单元素张量。

X.sum()
tensor(66.)

42锚框

目标检测算法中,通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含所感兴趣的目标,并调整区域边界从而更加准确地预测目标的真实边界框(ground-truth bounding box)

42.1基于锚框的目标检测算法

  • 也有不基于锚框的目标检测算法,但是基于锚框的目标检测算法占主流

  • 以每个像素为中心,生成多个缩放比(scale)和宽高比(aspect ratio)不同的边界框(这里的以每个像素点为中心指的是锚框中心点的像素,当中心位置给定时,已知宽和高的锚框是确定的)
    在这里插入图片描述

  • 锚框的宽度和高度分别是 w * s * sqrt® 和 h * s / sqrt®,可得锚框的面积是 w * h * s ^2,因为 s ∈(0,1],可以得到锚框的最大面积是 w * h,也就是输入图像的面积

  • 这里的 n + m - 1 的意思是:在实践中,只考虑包含 s1 或者 r1 的组合,s1 和 m 个宽高比共有 m 个组合,r1 和 n 个缩放比共有 n 个组合,这两种情况中(s1,r1)重复算了一次,所以最终以同一个像素为中心的锚框数量是 n + m - 1,因为输入图像的高度为 h ,宽度为 w,所以输入图像总共有 m * n 个像素,因此对于整个输入图像,总共生成了 w * h * (n + m - 1) 个锚框

  • 在这里插入图片描述
    锚框和边缘框的区别:边缘框bounding box指的是所标号的真实物体的位置;锚框anchor box指的是算法对边缘框,也就是物体真实位置的猜测

  • 提出多个被称为锚框的区域

  • 预测每个锚框里是否含有关注的物体

  • 如果是,预测从这个锚框到真实边缘框的偏移

(因为算法本身并不知道边缘框,也就是标号物体真实的位置,如果直接对位置进行预测,预测边缘框的四个坐标值的话相对来讲比较困难,所以一般算法的操作是先提出一些框,然后首先判断这些框中是否包含目标物体,如果确定包含目标物体的话,接下来预测基于该锚框相对于边缘框的偏移,也就是说基于锚框的目标检测不是直接对边缘框的四个坐标值进行预测,而是先提出一些锚框,然后等到差不多包含目标物体的时候,再对锚框进行调整到边缘框的位置)

整个过程中包含两次预测:

  • 类别:预测锚框中所包含物体的类别
  • 位置:预测锚框到边缘框的位置偏移

42.2 IoU-交并比

在这里插入图片描述

  • 用于衡量锚框和真实边缘框之间的相似度,两个框之间的交集与两个框的并集的比值
  • 取值范围[0,1]:0表示没有重叠;1表示完全重合(越接近1,两个框的相似度越高)
  • 它是Jacquard指数的特殊情况(给定两个集合,Jacquard指数表示两个集合的交集和两个集合的并集之间的比值)在这里插入图片描述

42.3在训练数据中标注锚框

训练集中,将每个锚框视为一个训练样本,为了训练目标检测模型,需要每个锚框的类别(class,与锚框相关的对象的类别)和偏移量(offset,真实边缘框相对于锚框的偏移量)标签
在预测的时候,首先为每个图像生成多个锚框,预测所有锚框的类别和偏移量,根据预测的偏移量调整它们的位置以获得预测的边缘框,最后只输出符合特定条件的预测边缘框

  • 基于锚框的目标检测是首先提出多个锚框,然后对锚框是否包含所感兴趣的物体以及锚框相对于边缘框的偏移进行预测
  • 所以在训练的时候,每一个锚框是一个训练样本
  • 对于每一个锚框来说,要么被标注成背景(不包含所感兴趣的物体,只包含背景),要么关联上一个真实的边缘框(锚框所框住的物体的标号与所关联的边缘框所包含的物体的标号相同;锚框相对于边缘框的偏移就是相对于它所关联的边缘框的偏移,这个偏移量根据锚框和真实边缘框中心坐标的相对位置以及这两个框的相对大小进行标记)
  • 鉴于数据集内不同的框的位置和大小不同,可以对那些相对位置和大小应用变换,使其获得分布更均匀且易于拟合的偏移量
  • 一般来讲算法会生成大量的锚框,而只有少量的边缘框,绝大部分锚框都是背景,背景类别的锚框通常被称为“负类”锚框,其余的被称为“正类”锚框

42.4 如何赋予锚框标号?

目标检测的训练集中带有真实边界框的位置以及其所包围物体类别的标签,所以如果要标记所生成的锚框,可以参考分配到的最接近此锚框的真实边界框的位置和类别标签
在这里插入图片描述
在这里插入图片描述
上图中的方格表示一个矩阵:4列表示4个边缘框,9行表示9个锚框,每一个小方格中的值表示对应的锚框与边缘框的交并比
然后将整个矩阵中最大的值挑选出来(假设是x23),那么就会将边缘框3中的标号给锚框2,并删除x23所在的行和列的其他值
在这里插入图片描述
再在剩下的矩阵元素中寻找最大值(假设是x71),则此时会将锚框7与边缘框1关联起来,同理删除掉x71所在的行和列的其他元素

在这里插入图片描述
以此类推,直到将所有的边缘框与对应的锚框关联起来,找出x54和x92
赋予锚框标号的算法不止上面这一种

42.5使用非极大值抑制(non-maximum suppression,NMS)输出在这里插入图片描述

  • 在预测时会为图像生成多个锚框,然后再为这些锚框逐个预测类别和偏移量,一个预测好的边界框是根据其中某个带有预测偏移量的锚框而生成的。所以最终会得到很多相似的具有明显重叠的预测边缘框,而且都是围绕着同一个目标,因此需要对这些相似的框进行剔除,最终保留下来比较干净的预测输出结果
  • NMS也是剔除方法之一,首先选中所有预测框中非背景类的最大预测值(对类的预测的softmax值,越接近于1置信度越高),然后去掉所有其它和它IoU值大于θ的预测值(也就是去掉和最大预测值相似度比较高的其它锚框),重复这个过程,直到所有的预测框要么被选中,要么被去掉,最终得到一个比较干净的输出(NMS的输出)
    在这里插入图片描述
    在执行非极大值抑制前,可以将置信度较低的预测边缘框移除,从而减少算法中的计算量;也可以对非极大抑制的输出结果进行后处理,比如只保留置信度更高的结果作为最终输出

42.5总结

  • 目前主流的目标检测算法都是基于锚框来预测的
  • 首先以图像的每个像素为中心生成大量不同形状的锚框(不同的算法生成锚框的方法不同),并对每个锚框赋予标号(对锚框赋予标号的方法也有很多种),这样每个锚框就会有一个类别标号和相对与边缘框的偏移,因此每个锚框可以作为一个样本进行训练
  • 交并比用于衡量两个边界框的相似性,它等于两个边界框像素区域的交集与并集之间的比值
  • 在训练集中,需要给每个锚框两种类型的标签:1、锚框中目标检测的类别;2、锚框相对于真实边缘框的偏移量
  • 在预测的时候会对每个锚框进行预测,会生成大量冗余的预测,可以使用NMS来去掉冗余的预测,从而简化输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值