前言

  • 深度卷积网络极大地推进深度学习各领域的发展,ILSVRC作为最具影响力的竞赛功不可没,促使了许多经典工作。我梳理了ILSVRC分类任务的各届冠军和亚军网络,简单介绍了它们的核心思想、网络架构及其实现。

    代码主要来自:https://github.com/weiaicunzai/pytorch-cifar100

  • ImageNet和ILSVRC

    • ImageNet是一个超过15 million的图像数据集,大约有22,000类。

    • ILSVRC全称ImageNet Large-Scale Visual Recognition Challenge,从2010年开始举办到2017年最后一届,使用ImageNet数据集的一个子集,总共有1000类。

  • 历届结果

网络/队名 val top-1 val top-5 test top-5 备注
2012 AlexNet 38.1% 16.4% 16.42% 5 CNNs
2012 AlexNet 36.7% 15.4% 15.32% 7CNNs。用了2011年的数据
2013 OverFeat 14.18% 7 fast models
2013 OverFeat 13.6% 赛后。7 big models
2013 ZFNet 13.51% ZFNet论文上的结果是14.8
2013 Clarifai 11.74%
2013 Clarifai 11.20% 用了2011年的数据
2014 VGG 7.32% 7 nets, dense eval
2014 VGG(亚军) 23.7% 6.8% 6.8% 赛后。2 nets
2014 GoogleNet v1 6.67% 7 nets, 144 crops
GoogleNet v2 20.1% 4.9% 4.82% 赛后。6 nets, 144 crops
GoogleNet v3 17.2% 3.58% 赛后。4 nets, 144 crops
GoogleNet v4 16.5% 3.1% 3.08% 赛后。v4+Inception-Res-v2
2015 ResNet 3.57% 6 models
2016 Trimps-Soushen 2.99% 公安三所
2016 ResNeXt(亚军) 3.03% 加州大学圣地亚哥分校
2017 SENet 2.25% Momenta 与牛津大学
  • 评价标准

    top1是指概率向量中最大的作为预测结果,若分类正确,则为正确;top5则只要概率向量中最大的前五名里有分类正确的,则为正确。

LeNet

Gradient-Based Learning Applied to Document Recognition

网络架构

import torch.nn as nn
import torch.nn.functional as func
class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv1 = nn.Conv2d(1, 6, kernel_size=5)self.conv2 = nn.Conv2d(6, 16, kernel_size=5)self.fc1 = nn.Linear(16*16, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = func.relu(self.conv1(x))x = func.max_pool2d(x, 2)x = func.relu(self.conv2(x))x = func.max_pool2d(x, 2)x = x.view(x.size(0), -1)x = func.relu(self.fc1(x))x = func.relu(self.fc2(x))x = self.fc3(x)return x

AlexNet

ImageNet Classification with Deep Convolutional Neural Networks

核心思想

  • AlexNet相比前人有以下改进:

  • 1.采用ReLU激活函数

    2.局部响应归一化LRN

    3.Overlapping Pooling

    4.引入Drop out

    5.数据增强

    6.多GPU并行

网络架构

  • 代码实现

class AlexNet(nn.Module):def __init__(self, num_classes=NUM_CLASSES):super(AlexNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(1, 96, kernel_size=11,padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2),nn.Conv2d(96, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2),nn.Conv2d(256, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2),)self.classifier = nn.Sequential(nn.Dropout(),nn.Linear(256 * 2 * 2, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, 10),)def forward(self, x):x = self.features(x)x = x.view(x.size(0), 256 * 2 * 2)x = self.classifier(x)return x

实验结果

ZFNet

Visualizing and Understanding Convolutional Networks

核心思想

  • 利用反卷积可视化CNN学到的特征。

  • 1.Unpooling:池化操作不可逆,但通过记录池化最大值的位置可实现逆操作。

    2.Rectification:ReLU

    3.Filtering:使用原卷积核的转置版本。

网络架构

实验结果

  • 特征可视化:Layer2响应角落和边缘、颜色连接;Layer3有更复杂的不变性,捕获相似纹理;Layer4展示了明显的变化,跟类别更相关;Layer5看到整个物体。

  • 训练过程特征演化:低层特征较快收敛,高层到后面才开始变化。

  • 特征不变性:小变换在模型第一层变化明显,但在顶层影响较小。网络输出对翻转和缩放是稳定的,但除了旋转对称性的物体,输出对旋转并不是不变的。

  • 遮挡敏感性:当对象被遮挡,准确性会明显下降。

  • ImageNet结果

VGG

Very Deep Convolutional Networks for Large-Scale Image Recognition

核心思想

  • 重复使用3x3卷积和2x2池化增加网络深度。

网络架构

  • VGG19表示有19层conv或fc,参数量较大。

  • 代码实现

cfg = {'A' : [64,     'M', 128,      'M', 256, 256,           'M', 512, 512,           'M', 512, 512,           'M'],'B' : [64, 64, 'M', 128, 128, 'M', 256, 256,           'M', 512, 512,           'M', 512, 512,           'M'],'D' : [64, 64, 'M', 128, 128, 'M', 256, 256, 256,      'M', 512, 512, 512,      'M', 512, 512, 512,      'M'],'E' : [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M']
}def vgg19_bn():return VGG(make_layers(cfg['E'], batch_norm=True))class VGG(nn.Module):def __init__(self, features, num_class=100):super().__init__()self.features = featuresself.classifier = nn.Sequential(nn.Linear(512, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, num_class))def forward(self, x):output = self.features(x)output = output.view(output.size()[0], -1)output = self.classifier(output)return outputdef make_layers(cfg, batch_norm=False):layers = []input_channel = 3for l in cfg:if l == 'M':layers += [nn.MaxPool2d(kernel_size=2, stride=2)]continuelayers += [nn.Conv2d(input_channel, l, kernel_size=3, padding=1)]if batch_norm:layers += [nn.BatchNorm2d(l)]layers += [nn.ReLU(inplace=True)]input_channel = lreturn nn.Sequential(*layers)

实验结果

GoogLeNet(v1)

Going Deeper with Convolutions

核心思想

  • 提出Inception模块,可在保持计算成本的同时增加网络的深度和宽度。

  • 代码实现

class Inception(nn.Module):def __init__(self, input_channels, n1x1, n3x3_reduce, n3x3, n5x5_reduce, n5x5, pool_proj):super().__init__()#1x1conv branchself.b1 = nn.Sequential(nn.Conv2d(input_channels, n1x1, kernel_size=1),nn.BatchNorm2d(n1x1),nn.ReLU(inplace=True))#1x1conv -> 3x3conv branchself.b2 = nn.Sequential(nn.Conv2d(input_channels, n3x3_reduce, kernel_size=1),nn.BatchNorm2d(n3x3_reduce),nn.ReLU(inplace=True),nn.Conv2d(n3x3_reduce, n3x3, kernel_size=3, padding=1),nn.BatchNorm2d(n3x3),nn.ReLU(inplace=True))#1x1conv -> 5x5conv branch#we use 2 3x3 conv filters stacked instead#of 1 5x5 filters to obtain the same receptive#field with fewer parametersself.b3 = nn.Sequential(nn.Conv2d(input_channels, n5x5_reduce, kernel_size=1),nn.BatchNorm2d(n5x5_reduce),nn.ReLU(inplace=True),nn.Conv2d(n5x5_reduce, n5x5, kernel_size=3, padding=1),nn.BatchNorm2d(n5x5, n5x5),nn.ReLU(inplace=True),nn.Conv2d(n5x5, n5x5, kernel_size=3, padding=1),nn.BatchNorm2d(n5x5),nn.ReLU(inplace=True))#3x3pooling -> 1x1conv#same convself.b4 = nn.Sequential(nn.MaxPool2d(3, stride=1, padding=1),nn.Conv2d(input_channels, pool_proj, kernel_size=1),nn.BatchNorm2d(pool_proj),nn.ReLU(inplace=True))def forward(self, x):return torch.cat([self.b1(x), self.b2(x), self.b3(x), self.b4(x)], dim=1)

网络架构

  • 代码实现

def googlenet():return GoogleNet()class GoogleNet(nn.Module):def __init__(self, num_class=100):super().__init__()self.prelayer = nn.Sequential(nn.Conv2d(3, 192, kernel_size=3, padding=1),nn.BatchNorm2d(192),nn.ReLU(inplace=True))#although we only use 1 conv layer as prelayer,#we still use name a3, b3.......self.a3 = Inception(192, 64, 96, 128, 16, 32, 32)self.b3 = Inception(256, 128, 128, 192, 32, 96, 64)#"""In general, an Inception network is a network consisting of#modules of the above type stacked upon each other, with occasional#max-pooling layers with stride 2 to halve the resolution of the#grid"""self.maxpool = nn.MaxPool2d(3, stride=2, padding=1)self.a4 = Inception(480, 192, 96, 208, 16, 48, 64)self.b4 = Inception(512, 160, 112, 224, 24, 64, 64)self.c4 = Inception(512, 128, 128, 256, 24, 64, 64)self.d4 = Inception(512, 112, 144, 288, 32, 64, 64)self.e4 = Inception(528, 256, 160, 320, 32, 128, 128)self.a5 = Inception(832, 256, 160, 320, 32, 128, 128)self.b5 = Inception(832, 384, 192, 384, 48, 128, 128)#input feature size: 8*8*1024self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.dropout = nn.Dropout2d(p=0.4)self.linear = nn.Linear(1024, num_class)def forward(self, x):output = self.prelayer(x)output = self.a3(output)output = self.b3(output)output = self.maxpool(output)output = self.a4(output)output = self.b4(output)output = self.c4(output)output = self.d4(output)output = self.e4(output)output = self.maxpool(output)output = self.a5(output)output = self.b5(output)#"""It was found that a move from fully connected layers to#average pooling improved the top-1 accuracy by about 0.6%,#however the use of dropout remained essential even after#removing the fully connected layers."""output = self.avgpool(output)output = self.dropout(output)output = output.view(output.size()[0], -1)output = self.linear(output)return output

实验结果

ResNet

Deep Residual Learning for Image Recognition

核心思想

  • 为了解决深层网络难以训练的问题,提出了残差模块和深度残差网络

  • 1.假设网络输入是x,经学习的输出是F(x),最终拟合目标是H(x)。

    2.深层网络相比浅层网络有一些层是多余的,若让多余层学习恒等变换H(x)=x,那么网络性能不该比浅层网络要差。

    3.传统网络训练目标H(x)=F(x),残差网络训练目标H(x)=F(x)+x。

    4.为了学习恒等变换,传统网络要求网络学习F(x)=H(x)=x,残差网络只需学习   F(x)=H(x)−x=x−x=0。残差学习之所以有效是因为让网络学习F(x)=0比学习F(x)=x要容易。

  • bottleneck

  • 代码实现

class BottleNeck(nn.Module):"""Residual block for resnet over 50 layers"""expansion = 4def __init__(self, in_channels, out_channels, stride=1):super().__init__()self.residual_function = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Conv2d(out_channels, out_channels, stride=stride, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Conv2d(out_channels, out_channels * BottleNeck.expansion, kernel_size=1, bias=False),nn.BatchNorm2d(out_channels * BottleNeck.expansion),)self.shortcut = nn.Sequential()if stride != 1 or in_channels != out_channels * BottleNeck.expansion:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels * BottleNeck.expansion, stride=stride, kernel_size=1, bias=False),nn.BatchNorm2d(out_channels * BottleNeck.expansion))def forward(self, x):return nn.ReLU(inplace=True)(self.residual_function(x) + self.shortcut(x))

网络架构

  • 代码实现

def resnet152():""" return a ResNet 152 object"""return ResNet(BottleNeck, [3, 8, 36, 3])class ResNet(nn.Module):def __init__(self, block, num_block, num_classes=100):super().__init__()self.in_channels = 64self.conv1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True))#we use a different inputsize than the original paper#so conv2_x's stride is 1self.conv2_x = self._make_layer(block, 64, num_block[0], 1)self.conv3_x = self._make_layer(block, 128, num_block[1], 2)self.conv4_x = self._make_layer(block, 256, num_block[2], 2)self.conv5_x = self._make_layer(block, 512, num_block[3], 2)self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(512 * block.expansion, num_classes)def _make_layer(self, block, out_channels, num_blocks, stride):"""make resnet layers(by layer i didnt mean this 'layer' was thesame as a neuron netowork layer, ex. conv layer), one layer maycontain more than one residual blockArgs:block: block type, basic block or bottle neck blockout_channels: output depth channel number of this layernum_blocks: how many blocks per layerstride: the stride of the first block of this layerReturn:return a resnet layer"""# we have num_block blocks per layer, the first block# could be 1 or 2, other blocks would always be 1strides = [stride] + [1] * (num_blocks - 1)layers = []for stride in strides:layers.append(block(self.in_channels, out_channels, stride))self.in_channels = out_channels * block.expansionreturn nn.Sequential(*layers)def forward(self, x):output = self.conv1(x)output = self.conv2_x(output)output = self.conv3_x(output)output = self.conv4_x(output)output = self.conv5_x(output)output = self.avg_pool(output)output = output.view(output.size(0), -1)output = self.fc(output)return output

实验结果

ResNeXt

Aggregated Residual Transformations for Deep Neural Networks

核心思想

  • 通过重复构建block来聚合一组相同拓扑结构的特征,并提出一个新维度”cardinality“。

  • ResNeXt结合了VGG、ResNet重复堆叠模块和Inception的split-transform-merge的思想。

以下三者等价,文章采用第三种实现,其使用了组卷积。

  • 代码实现

CARDINALITY = 32
DEPTH = 4
BASEWIDTH = 64class ResNextBottleNeckC(nn.Module):def __init__(self, in_channels, out_channels, stride):super().__init__()C = CARDINALITY #How many groups a feature map was splitted into#"""We note that the input/output width of the template is fixed as#256-d (Fig. 3), We note that the input/output width of the template#is fixed as 256-d (Fig. 3), and all widths are dou- bled each time#when the feature map is subsampled (see Table 1)."""D = int(DEPTH * out_channels / BASEWIDTH) #number of channels per groupself.split_transforms = nn.Sequential(nn.Conv2d(in_channels, C * D, kernel_size=1, groups=C, bias=False),nn.BatchNorm2d(C * D),nn.ReLU(inplace=True),nn.Conv2d(C * D, C * D, kernel_size=3, stride=stride, groups=C, padding=1, bias=False),nn.BatchNorm2d(C * D),nn.ReLU(inplace=True),nn.Conv2d(C * D, out_channels * 4, kernel_size=1, bias=False),nn.BatchNorm2d(out_channels * 4),)self.shortcut = nn.Sequential()if stride != 1 or in_channels != out_channels * 4:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels * 4, stride=stride, kernel_size=1, bias=False),nn.BatchNorm2d(out_channels * 4))def forward(self, x):return F.relu(self.split_transforms(x) + self.shortcut(x))

网络架构

  • 代码实现

    以下部分跟ResNet基本一致,重点关注ResNextBottleNeckC的实现。

def resnext50():""" return a resnext50(c32x4d) network"""return ResNext(ResNextBottleNeckC, [3, 4, 6, 3])class ResNext(nn.Module):def __init__(self, block, num_blocks, class_names=100):super().__init__()self.in_channels = 64self.conv1 = nn.Sequential(nn.Conv2d(3, 64, 3, stride=1, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True))self.conv2 = self._make_layer(block, num_blocks[0], 64, 1)self.conv3 = self._make_layer(block, num_blocks[1], 128, 2)self.conv4 = self._make_layer(block, num_blocks[2], 256, 2)self.conv5 = self._make_layer(block, num_blocks[3], 512, 2)self.avg = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(512 * 4, 100)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)x = self.avg(x)x = x.view(x.size(0), -1)x = self.fc(x)return xdef _make_layer(self, block, num_block, out_channels, stride):"""Building resnext blockArgs:block: block type(default resnext bottleneck c)num_block: number of blocks per layerout_channels: output channels per blockstride: block strideReturns:a resnext layer"""strides = [stride] + [1] * (num_block - 1)layers = []for stride in strides:layers.append(block(self.in_channels, out_channels, stride))self.in_channels = out_channels * 4return nn.Sequential(*layers)

实验结果

SENet

Squeeze-and-Excitation Networks

核心思想

  • 卷积操作融合了空间和特征通道信息。大量工作研究了空间部分,而本文重点关注特征通道的关系,并提出了Squeeze-and-Excitation(SE)block,对通道间的依赖关系进行建模,自适应校准通道方面的特征响应

  • SE block

    表示transformation(一系列卷积操作);表示squeeze,产生通道描述;表示excitation,通过参数WW来建模通道的重要性。表示reweight,将excitation输出的权重逐乘以先前特征,完成特征重标定。

  • SE-ResNet Module

  • 代码实现

class BottleneckResidualSEBlock(nn.Module):expansion = 4def __init__(self, in_channels, out_channels, stride, r=16):super().__init__()self.residual = nn.Sequential(nn.Conv2d(in_channels, out_channels, 1),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Conv2d(out_channels, out_channels, 3, stride=stride, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Conv2d(out_channels, out_channels * self.expansion, 1),nn.BatchNorm2d(out_channels * self.expansion),nn.ReLU(inplace=True))self.squeeze = nn.AdaptiveAvgPool2d(1)self.excitation = nn.Sequential(nn.Linear(out_channels * self.expansion, out_channels * self.expansion // r),nn.ReLU(inplace=True),nn.Linear(out_channels * self.expansion // r, out_channels * self.expansion),nn.Sigmoid())self.shortcut = nn.Sequential()if stride != 1 or in_channels != out_channels * self.expansion:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels * self.expansion, 1, stride=stride),nn.BatchNorm2d(out_channels * self.expansion))def forward(self, x):shortcut = self.shortcut(x)residual = self.residual(x)squeeze = self.squeeze(residual)squeeze = squeeze.view(squeeze.size(0), -1)excitation = self.excitation(squeeze)excitation = excitation.view(residual.size(0), residual.size(1), 1, 1)x = residual * excitation.expand_as(residual) + shortcutreturn F.relu(x)

网络架构

  • 代码实现

def seresnet50():return SEResNet(BottleneckResidualSEBlock, [3, 4, 6, 3])class SEResNet(nn.Module):def __init__(self, block, block_num, class_num=100):super().__init__()self.in_channels = 64self.pre = nn.Sequential(nn.Conv2d(3, 64, 3, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True))self.stage1 = self._make_stage(block, block_num[0], 64, 1)self.stage2 = self._make_stage(block, block_num[1], 128, 2)self.stage3 = self._make_stage(block, block_num[2], 256, 2)self.stage4 = self._make_stage(block, block_num[3], 516, 2)self.linear = nn.Linear(self.in_channels, class_num)def forward(self, x):x = self.pre(x)x = self.stage1(x)x = self.stage2(x)x = self.stage3(x)x = self.stage4(x)x = F.adaptive_avg_pool2d(x, 1)x = x.view(x.size(0), -1)x = self.linear(x)return xdef _make_stage(self, block, num, out_channels, stride):layers = []layers.append(block(self.in_channels, out_channels, stride))self.in_channels = out_channels * block.expansionwhile num - 1:layers.append(block(self.in_channels, out_channels, 1))num -= 1return nn.Sequential(*layers)

实验结果

总结

一、小结

1.LeNet[1998]:CNN的鼻祖。

2.AlexNet[2012]:第一个深度CNN。

3.ZFNet[2012]:通过DeconvNet可视化CNN学习到的特征。

4.VGG[2014]:重复堆叠3x3卷积增加网络深度。

5.GoogLeNet[2014]:提出Inception模块,在控制参数和计算量的前提下,增加网络的深度与宽度。

6.ResNet[2015]:提出残差网络,解决了深层网络的优化问题。

7.ResNeXt[2016]:ResNet和Inception的结合体,Inception中每个分支结构相同,无需人为设计。

8.SENet[2017]:提出SE block,关注特征的通道关系。

二、经典模型中结构、参数对比

参考

  • paper

[1]LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.

[2]Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

[3]Zeiler M D, Fergus R. Visualizing and understanding convolutional networks[C]//European conference on computer vision. springer, Cham, 2014: 818-833.

[4]Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.

[5]Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 1-9.

[6]He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

[7]Xie S, Girshick R, Dollár P, et al. Aggregated residual transformations for deep neural networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1492-1500.

[8]Hu J, Shen L, Sun G. Squeeze-and-excitation networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7132-7141.

  • blog

ImageNet历年冠军和相关CNN模型

残差网络ResNet笔记

(二)计算机视觉四大基本任务(分类、定位、检测、分割)

论文笔记:CNN经典结构2(WideResNet,FractalNet,DenseNet,ResNeXt,DPN,SENet)

论文笔记:CNN经典结构1(AlexNet,ZFNet,OverFeat,VGG,GoogleNet,ResNet)

深度学习在计算机视觉领域(包括图像,视频,3-D点云,深度图)的应用一览

(本文出自平台合作作者Vincent,cs硕士在读。)

不断更新资源

获取更多精彩

长按二维码扫码关注

图像分类丨ILSVRC历届冠军网络「从AlexNet到SENet」相关推荐

  1. 干货 | ImageNet 历届冠军架构最新评析:哪个深度学习网络最适合你(转)

    转自:新智元 论文来自:An Analysis of Deep Neural Network Models for Practical Applications [导读]计算机图像计算水平稳步的增长, ...

  2. 图像识别 ImageNet 比赛 历届冠军评析:看看哪个深度学习模型最适合你?AlexNet / BN CNN / Google LeNet / RestNet / VGG / Inception

    原文链接: https://mp.weixin.qq.com/s/I5XgYrPCCGyfV2qTI0sJhQ 深度神经网络自出现以来,已经成为计算机视觉领域一项举足轻重的技术.其中,ImageNet ...

  3. 【干货】ImageNet 历届冠军最新评析:哪个深度学习模型最适合你?

    点击上方"深度学习与计算机视觉",选择"置顶公众号" 精品文章,第一时间送达 转载自:新智元,未经允许不得二次转载 [导读]ImageNet 图像分类竞赛极大地 ...

  4. ImageNet 历届冠军最新评析:哪个深度学习模型最适合你?

    原文链接: https://mp.weixin.qq.com/s/I5XgYrPCCGyfV2qTI0sJhQ 深度神经网络自出现以来,已经成为计算机视觉领域一项举足轻重的技术.其中,ImageNet ...

  5. ImageNet历届冠军作品、keras了解

    周末总结 本周学习内容: ImageNet历届冠军作品 keras了解 一.ImageNet历届冠军作品 在多届冠军作品中,我挑选了四个最有特点的网络进行了学习.其中包括:AlexNet.Google ...

  6. 图像分类中的深度学习网络汇总

    深度学习在图片处理中的应用是从图像分类开始的,所以我们要先从图像分类中了解深度学习的应用情况. 本文根据阅读大量的资料和视频资源,简单地总结了图像分类中所有经典的深度学习神经网络. 1.LeNet L ...

  7. python实验总结与反思_警示与反思丨什么是Python网络爬虫?看这篇清晰多了!

    原标题:警示与反思丨什么是Python网络爬虫?看这篇清晰多了! 什么是爬虫? 网络爬虫(Web crawler),就是通过网址获得网络中的数据.然后根据目标解析数据.存储目标信息.这个过程可以自动化 ...

  8. 网络工程师就是网管?网工版「10万个为什么」,快拿来吧你!

    最近公众号阅读的粉丝越来越多了,加我好友问的问题真的是千奇百怪.很多是入门级的问题,但是他们却一直没有得到一个准确的答案--所以,老杨今天整理一下最近粉丝问的比较多的提问,做个10万个为什么系列问答. ...

  9. java歌唱比赛冠亚军_歌手历届冠军盘点 这是一档歌唱竞演类真人秀节目

    歌手历届冠军盘点 这是一档歌唱竞演类真人秀节目 小雅谈娱乐 • 2020-03-05 17:53:38 • 文章 • 阅读 2911 我是歌手这个节目一开始深受观众们的喜爱,歌手之间的比拼堪称神仙打架 ...

最新文章

  1. wait跟sleep的区别
  2. STL中的双向队列deque
  3. windows powershell
  4. Mac OS X Yosemite安装盘U盘制作
  5. 东师计算机应用基础18秋在线作业3答案,奥鹏东师计算机应用基础15秋在线作业3试卷及答案(4)...
  6. 7 个让您需要渐进式 Web 应用程序做项目开发的理由
  7. java 算法优化向导
  8. 顺利搭建了oracle
  9. 在vue中实现picker样式_基于Vue实现timepicker
  10. [转]给控件做数字签名
  11. 一路走来一路歌—我和团队有个约会
  12. BZOJ1588: [HNOI2002]营业额统计
  13. 度量两个概率分布差异性/距离的指标总结_KL 散度(相对熵)交叉熵 JS散度 Wasserstein-1距离 Earth-Mover (EM)distance
  14. WinRAR 4.00 beta1 简体中文版
  15. Web前端 ---入门教学
  16. SOSO发布国内首家高清街景地图 引领地图换代
  17. Mac m1 tensorflow 内核似乎挂掉了,它很快将自动重启
  18. QT 控件增加双击事件
  19. 苹果App store 2015最新审核标准
  20. 五款微信编辑器优缺点评测

热门文章

  1. 修改pycharm缓存文件路径
  2. unicode字符集详解,中文字符范围,标点符号范围等
  3. 单声道”与“立体声”的区别
  4. 剑指 Offer II 002. 二进制加法
  5. 水彩风职业规划PP模板
  6. [论文阅读] Unsupervised Domain Adaptation for Cross-Modality Retinal Vessel Segmentation
  7. vivaldi浏览器_Vivaldi 1.0版本:您的新默认浏览器?
  8. python模拟浏览器请求
  9. VMware虚拟机用CommVault备份后快照无法整合的真相!
  10. Windows server DNS服务器搭建