Fenrier Lab

如何一步步地实现各种深度的 ResNet

ResNet 通过建立短路连接,实现了一般神经网络难以模拟的恒等映射,其常用的具体架构一般有 resnet18,resnet34,resnet50,resnet101 和 resnet152 这五种,本文将从代码层面详细分析如何搭建这些结构。 首先,从最粗略的层面来看,各种 resnet 都有一个大致相同的结构,可以说是骨架中的骨架,即(conv -> bn -> relu -> maxpool -> 4 x res_layer),其简化代码如下 class ResNet(nn.Module): def __init__(self): self.conv1 = nn.Conv2d() self.bn1 = nn.BatchNorm2d(...
点我阅读更多...

对目标检测模型 PR 曲线的原理分析和实现

PR曲线其实就是以准确率(Precise)为横轴,召回率(Recall)为纵轴的曲线,定义很简单,但是我们立即会产生一个疑问,那就是对于一个确定的模型,怎么准确率咋还能变化呢?所以要理解 PR 曲线,首先需要知道准确率和召回率是怎么变化的。 我们知道,准确率指的是准确检测的物体占总检测物体的比例(需要注意的是,我们的分析都是建立在单一类别之上的),比如一次测试过程,我们检测到了 M 个物体,但实际上只有 P 个物体是被准确检测到的,其他都属于误检,那么准确率就是 P / M。而召回率则是准确检测的物体占总的物体的比例,还是同样的测试,假如这批样本中共有 N 个物体,那么召回率就等于 P / N。准确率的分母是检测到的物体总数量,召回率的分母是实际物体总数量,所以准确率又叫查准率,召回...
点我阅读更多...

对残差网络动机的理解

神经网络以其强大的非线性表达能力而获得人们的青睐,但是将网络层数加深的过程中却遇到了很多困难,随着批量正则化,ReLU 系列激活函数等手段的引入,在多层反向传播过程中产生的梯度消失和梯度爆炸问题也得到了很大程度的解决。然而即便如此,随着网络层数的增加导致的拟合能力退化现象依然存在,如下图所示 可以看到,训练误差和测试误差都随网络层数的增加而增加,可以排除过拟合造成的预测性能退化。所以这里存在一个逻辑上讲不通的问题,通常来说,我们认为神经网络可以学习出任意形状的函数,具体到这个问题上来,假如浅层网络可以获得一个不错的效果,那么理论上深层网络增加的额外层只需要学会恒等映射,即可获得与浅层网络相同的预测精度 但实际情况根本不是这么回事儿,那么问题出在哪儿了呢?我们一厢情愿的认为中...
点我阅读更多...

关于 Faster RCNN 目标检测算法的详细分析

追本溯源 Faster RCNN 的最初版本是 RCNN,这是将神经网络算法应用在目标检测领域的最初的尝试之一,因此其方法显得有些稚嫩,或者说更易于理解接受。RCNN 的全称是 Regions with CNN features,简单来说,RCNN 的原理是用 CNN 来提取 Region 的特征,然后将这些特征送入分类模型进行分类,当时比较流行的分类模型还是像SVM这种比较传统的算法,为什么会说 RCNN 是两阶段的模型,就是因为最开始特征提取和分类模型都不统一,模型的训练过程不是连续的。 前面我们提到 Region 这个词,如果不解释一下的话可能会引起迷惑。其实 Region 就是图片中的一块区域,因为目标检测模型和LeNet、VGG这些分类模型不一样,其目的是为了检测图片中的...
点我阅读更多...

如何在神经网络中实现不同尺寸图片的批量输入

当我们使用 VGG 或者 ResNet 做图片分类的时候,最后一层接的全连接层的输出尺寸必然是恒定值,即潜在类别数量,尽管骨架卷积网络不要求输入的图片具有相同的尺寸,但为了接上全连接层,也必须将所有输入图片都变形到相同的尺寸。所以一般来讲,在数据加载阶段会有一个 Resize 操作 transform = transforms.Compose( [ transforms.ToTensor(), transforms.Resize(256), transforms.RandomCrop(224), ... ] ) 这种强行将所有图片变换到一致大小的操作会造成图片中物体的几何变形,在 SPPNet 的论文中,作者认为这对图片识别精度不利,于是提...
点我阅读更多...