经典卷积架构:LeNet-5
LeNet-5LeNet-5作为CNN的开山之作,在如今看来并不复杂,但在当时可以称得上是开创性的成就,并且其之后出现的许多卷积架构基本遵循LeNet-5的思想。LeNet-5的网络结构如上图所示,它最开始被用于解决手写数字识别问题。
对于一张32*32单通道手写数字图片,首先经过卷积(kernel_size: 5)得到6张28*28的特征图,然后做下采样(池化,kernel_size=2,stride=2)将特征图尺寸减半;接着经过一顿卷,得到120张1*1的特征图;将其展平,得到120维的向量,经过两个全连接层,输出10维的向量,代表该图片中的数字取值的概率(取值集合为0到9)。
当然,卷积与池化操作之间做了激活操作,在当时用的Simoid和Tanh。在稍后的代码实现中,我们会改成现在更常用的ReLU。更多细节,将在代码实现中体现。
PyTorch 实现LeNet-5123456789101112131415161718192021222324252627282930import torchimport torch.nn as nnclass LeNet(nn.Module): ...
图像数据的标准化
对于一份图像数据集,在送入模型之前,往往需要做些预处理操作,标准化便是常用的一种预处理操作,它能够起到加速模型收敛的作用。
标准化公式为:$$\frac{X-X_{mean}}{X_{std}}$$其中,$X$是原数据集,$X_{mean}$和$X_{std}$分别代表原数据的均值和标准差。
从表格数据的标准化说起对于表格数据,只需分别计算每列的均值和标准差即可。举个栗子,假设某数据集X如下:
.
feature1
feature2
样本1
1
30
样本2
1.5
45
样本3
0.9
35
则:
第一个特征的均值为$$(1+1.5+0.9)/3=1.133$$第二个特征的均值为$$(30+45+35)/3=36.66$$第一个特征的标准差为$$\sqrt{[(1-1.133)^2+(1.5-1.133)^2+(0.9-1.133)^2]/3}=0.2624$$第二个特征的标准差为$$\sqrt{[(30-36.66)^2+(45-36.66)^2+(35-36.66)^2]/3}=6.236$$
于是,该数据集的均值为$[1.133,36.66]$,标准差为 ...
目标检测中的非极大抑制+PyTorch实现
什么是非极大抑制?在目标检测中,为了提升召回率,通常的检测结果中会出现一个目标对应多个框的结果。
每个框对应的数字代表置信度,通俗来说,就是代表有多大把握确定框内有目标,取值越大,说明越有把握。
但是,对于我们来说,每个目标只需要一个对应框就足够了,因此需要从这么多框中选出最好的,非极大抑制(NMS)就是用来解决这个问题的。
对于只含有一类目标的图片来说,非极大抑制的步骤如下:
(0)设定一个置信度阈值thres和一个IoU阈值iou_thres,删除置信度小于thres的框;
(1)按照置信度对这些框从大到小排序;
(2)取出置信度最大的框放在一边,并将此框与其余的框求IoU,对于其余的框,只保留IoU小于IoU_thres的框;
(3) 重复(1)(2),最后剩余的框(也就是取出来的框)就是非极大抑制得到的结果。
注意,以上步骤中,最后得到的结果可能不止一个,因为一张图片中可能有多个同类别目标。
如果是一张图片中含有不止一个类别的目标,只需分别对每个类别的目标重复上面的步骤即可。
下面通过代码实现来加深下理解。
非极大抑制的PyTorch实现12345678910111213141 ...
目标检测中的IoU理论讲解+代码实现
IoU 理论讲解在计算机中,图像的坐标系是以左上角为原点,原点向右(x轴)和向下(y轴)分别作为两个坐标轴构成的,分别代表图像的宽度(width)和高度(height)。
下面的图片中,红色框是标注好的框(Ground Truth),蓝色框是预测出来的。
那么这两个框的交集就是下面黄色填充的区域:
而两个框的并集,就是把两个框的区域合并(重叠部分+不重叠部分),就像下面这样:
IoU就是交集区域面积与并集区域面积的比值,其计算公式如下:$$IoU=\frac{交集}{并集}$$
假设已知每个框的左上角坐标和右下角坐标,具体地,用[x1,y1,x2,y2]代表蓝色框的坐标,用[xx1,yy1,xx2,yy2]代表红色框的坐标:
现在来确定交集的左上角和右下角的坐标:
左上角坐标为$(max(x1,xx1),max(y1,yy1))$右下角坐标为$(min(x2,xx2),min(y2,yy2))$
那么两者的交集区域面积为:$$[min(y2,yy2)-max(y1,yy1)]*[min(x2,xx2)-max(x1,xx1)]$$
当两者无交集时,上式的乘法中有一项为负数,我们可以规定 ...
手把手教你打造一个汽车检测器!
本文将带你打造一个汽车检测器,使用的算法是PyTorch版本的YOLOV3。本文不会讲解该算法的细节,而是专注于如何去实现自己的汽车检测器,主要包括数据下载,数据清洗,数据集制作以及训练和检测(图片检测,视频检测)等过程。即使你不知道YOLOV3是什么也没关系,这对于阅读本文几乎毫无影响。
数据集下载为了检测汽车,首先需要获取含有汽车的标注好的数据集,这里我选择了KITTI。由于官网下载太慢,推荐使用下面的百度云链接进行下载。
下载KITTI数据集:https://pan.baidu.com/s/1t3TXXkqVR4NGqZwQiGEIzg提取码:cw35
源码来自Github开源项目https://github.com/eriklindernoren/PyTorch-YOLOv3,为了适应本文的内容,我将其做了些许更改,一并上传到了百度云,在公众号后台回复"detect"直达下载地址。
数据清洗在主目录PyTorch-YOLOv3-master下新建文件夹datasets,在datasets中新建四个文件夹:train_image,train_label,pr ...
魔改交叉熵
在之前的这篇文章中,我们介绍了PyTorch中的交叉熵损失函数的具体使用方法(传送门),并举了大量的栗子进行解释。
在此基础上,就可以尝试对交叉熵进行魔改啦~
CrossEntropyLoss到底做了什么?
吃瓜群众:那说一下魔改的具体内容呗…
别着急,在开始魔改之前,需要花些篇幅介绍下在PyTorch中的CrossEntropyLoss内部所做的事情。这是官方给出的关于CrossEntropyLoss的维度说明。简而言之,分为两种情况:
网络的输出shape为[N,C],对应的真实类别标签维度就得是[N];
网络的输出shape为[N,C,d1,d2,...],对应的真实类别标签维度就得是[N,d1,d2,...];
对于第一种情况,我们在这篇文章(传送门)的最后已经讲过,本文将以第二种形式的数据进行举例说明。
来看一下贯穿本文的一个栗子:
假设网络的输出output的shape为[1,3,256,256],其中1代表batchsize,3代表这是个三分类问题,后面的两个256可以看作是一张256*256的图片的高(height)和宽(width),也就是说,总共有256*2 ...
那些年,我们一起实现的交叉熵
最近在做交叉熵的魔改,所以需要好好了解下交叉熵,遂有此文。
关于交叉熵的定义请自行百度,相信点进来的你对其基本概念不陌生。
本文将结合PyTorch,介绍离散形式的交叉熵在二分类以及多分类中的应用。注意,本文出现的二分类交叉熵和多分类交叉熵,本质上都是一个东西,二分类交叉熵可以看作是多分类交叉熵的一个特例,只不过在PyTorch中对应方法的实现方式不同(不同之处将在正文详细讲解)。
好了,废话少叙,正文开始~
二分类交叉熵$$L=-\frac1N \sum_{i=1}^{N}[y_ilog(p_i)+(1-y_i)log(1-p_i)]$$其中,$N$是总样本数,$y_i$是第$i$个样本的所属类别,$p_i$是第$i$个样本的预测值,一般来说,它是一个概率值。
上栗子:
.
$y_i$
$p_i$
第1个样本
1
0.8
第1个样本
0
0.2
第1个样本
0
0.4
按照上面的公式,交叉熵计算如下:$$L=\frac13[(1*log0.8+(1-1)log(1-0.8))+(0log0.2+(1-0)log(1-0.2))+(0log0.4+(1-0)*l ...
1小时快速入门PyTorch
12#二话不说,先把包导入进来~import torch
tensor初始化123#定义一个tensormy_tensor=torch.tensor([[1,2,3],[4,5,6]])print(my_tensor)
tensor([[1, 2, 3],
[4, 5, 6]])
123#指定tensor的数据类型my_tensor=torch.tensor([[1,2,3],[4,5,6]],dtype=torch.float32)print(my_tensor)
tensor([[1., 2., 3.],
[4., 5., 6.]])
123#指定devicemy_tensor=torch.tensor([[1,2,3],[4,5,6]],dtype=torch.float32,device='cuda')print(my_tensor)
tensor([[1., 2., 3.],
[4., 5., 6.]], device='cuda:0')
123#如果有gpu则使用gpu,此时d ...
含码量为零--醒醒,你的模型或许是错的
进化,进化这个社会充满了模型。
按照达尔文的进化论,从毫不起眼的微生物到如今世间万物的演变,都是在不断地优胜劣汰的追逐中自发产生的,今天的一切,都是自然选择的结果,包括你我。
走过了茹毛饮血的原始时代,熬过了奴隶社会的艰辛,在两千多年的封建社会中不断发展着,冲破了近代以来帝国列强的封锁与侵略,建立了新中国。直至今日,在马克思主义与中国实际相结合的思想的正确引领下,我国开辟了中国特色社会主义道路,并在这条道路上奋勇前行。
1如何去解释其正确性?
社会本身就是一个模型。
只是在最开始的时候,模型的权重是被随机初始化的,模型根本什么都不会。无论面对任何问题,模型只能随机的给出答案,这无疑是在碰运气。
为了进一步回答这一问题,必须回到过去。
回到过去万物伊始时,诞生了许许多多不同种类的微小生命体,这些生命体在一开始面对这个世界的时候是茫然无措的,天敌,风雨,雷电,海啸,地震,它们任凭着自然力量的摆布。但是,在经历了些许后,某些生命体从中学到了某些机理,尽管我们很难解释这些机理是如何被学习到的,但这一点突破使得这些生命体进化了,有些进化出了感光系统,从而可以帮助它们防御天敌的捕食,有些进化出了可 ...