该论文提出深度神经网络的深度对于大规模图像识别模型的表现有显著提升。模型使用3*3的小型卷积过滤器和较小的卷积层步幅,并且其神经网络层数达到了16-19层。基于这些发现在ImageNet-2014比赛中取得了第一名和第二名。并且该模型在其他类型的图像数据集上也具有泛化性,具有良好的迁移能力。
神经网络的输入是224×224像素尺寸的RGB图片,并且对图片进行了预处理,减去平均RGB值。模型中使用了非常小的感受野,尺寸为3×3,这种设置刚好能捕获一个像素周围的其他像素值。并且卷积层的步幅为1,这意味这每个像素都会被进行特征提取。经过这种卷积处理后,输入的空间分辨率依旧保持不变。空间池化由跟在卷积层后面的5个最大池化层执行。最大池化在2×2的窗口上执行,步幅为2。
卷积层后是全连接层,第1、2层输入为4096通道,第3层进行1000路分类,最后是softmax层。所有的隐藏层都设置了ReLU非线性激活函数。不同于AlexNet(Krizhevsky et al., 2012),该模型不包含LRN(Local Response Normalization),它不会改进模型效果并且会增加计算量。

图1中每一列都表示一种卷积网络设置,他们在神经网络结构上都是类似的,只有卷积网络的深度不同,网络深度从11层到19层。卷积层的宽度也更小,第一层只有64 。每经过一次最大池化,卷积层宽度就会变为原来的两倍。
图2展示了这6种网络模型的参数数量,深度的增加并没有使神经网络参数更多,反而比AlexNet等模型参数更少一些。
相比较于使用更大的感受野和卷积步幅,整个模型都只使用了3×3的感受野和步幅为1的卷积方式。在不插入池化操作的情况下,两个3×3的卷积层栈总共有5×5的有效感受野,三个卷积层则有7×7的有效感受野。一个7×7的卷积层的有效感受野和三个3×3的卷积栈的有效感受野相同,并且通过合并三个非线性校正层,使得决策函数更加具有区分性。这种操作也减少了参数的数量:假设三层3×3的卷积栈输入和输出都有C个通道,所需参数为\(3(3^2C^2)=27C^2\), 而一个7×7卷积层的参数为\(7^2C^2=49C^2\) 。所需参数数量变为原来的81%。这种方式可以看成是对7×7的卷积过滤施加了一个正则化,使得他们通过3×3过滤器进行分解,并加入了非线性激活函数。
配置C中1×1卷积层的加入,可以在不影响感受野的情况下,为决策函数增加非线性激活函数。1×1的卷积层也被使用在“Network of Network-Lin et al. (2014)”模型中。
模型训练通过使用带动量的小批量梯度下降(基于LeCun等人的反向传播算法),优化多项式逻辑回归目标。批数量为256,动量0.9 。通过设置L2惩罚系数为5×10^-4来进行权重衰减,在两个全连接层加入参数为0.5的dropout。学习率被设置为0.01,当验证集准确率停止下降后,将学习率除以10 。经过74轮训练37万次迭代,学习率下降三次。
虽然与AlexNet相比该模型具有更多的参数和更深的网络结构,但是却能够更快地收敛,这可能是由于更深的网络层数和更小的卷积尺寸,或者是在某些层进行的初始化。
通过对表1中的网络结构A进行随机初始化预训练,然后将训练参数用于更深层次的网络,把A的参数初始化前四层卷积层后后三层全连接层。对于其他层采取随机初始化,将权重设置为均值为0,方差为0.01的正态分布,偏差被设置为0 。也可以使用Glorot & Bengio (2010) 的随机初始化过程而不进行预训练。
为了获得224×224的输入图片,对尺寸变换后的图片进行随机裁决,每次迭代的每次随机梯度下降都进行一次裁剪。训练也使用了(Krizhevsky et al., 2012)的数据增强方法,对图像进行水平镜像和随机RGB颜色变换。
训练集也通过改变训练集图片尺寸来进行数据增强:将S记为图片放缩后最小边的长度,输入图片的像素尺寸固定为224×224,所以放缩后的图片S不能小于224。当图片放缩后尺寸S=224,模型会获取整个图片的特征,生成最小的图片图片。如果放缩后图片尺寸S远大于224,那么图片就会进行裁剪后再输入模型。这种裁剪会获得图片每个分块的特征。
在训练过程中会使用两种放缩尺寸S。第一种是固定参数,选取了S的两种大小:256和384 。通过将训练图片放缩到这两种尺寸进行训练。模型会对放缩后的图片进行裁切,获得多个224×224的输入图片。
第2种方法是将S设置为多尺度,每个训练图片会被随机放缩到\([S_{min},S_{max}]\)尺度范围内。本论文选取的最小值和最大值为256和512 。因为图片中的对象可能是各种大小的,这种放缩更有可能捕获到图像中不同位置不同大小的对象。为了加速训练,本文中先预训练了固定尺寸S=384的模型。
在测试时,会将图片放缩到比例为Q。Q不必等于训练集的放缩比例S。
第一种测试方式为dense evaluation。通过将网络的全连接层进行替换,第一个全连接层换为7×7的卷积层,剩下两个全连接层换为1×1的卷积层。然后把测试图片放缩后输入全卷积网络进行测试,得到一个类别得分图,通道的数量和分类的数量一致,以及一个依赖于输入图像尺寸的变量空间分辨率。测试中也会将测试集图片进行水平翻转,然后将这些图片的softmax分类结果进行平均,获得最终的分类。
因为全卷积网络应用于整个图像,也就没有必要去在测试时采样多个裁剪图片,这会很低效,需要网络重新计算每个裁剪图片。
同时,multi-crop使用一组裁剪图片也可以改进测试准确率,相较于全卷积网络,它可以在对输入图像的每个采样都得出一个结果。
multi-crop评估和稠密评估一定程度上是互补的,这是由于不同的卷积边界条件。当把卷积网络应用于一个裁切图片,其包含的特征映射是填充零的。而稠密评估因为卷积和空间池化操作,是填充同一裁切图片相邻部分的特征,这显著增加了整个网络的感受野以及捕获的上下文。但是multi-crop提升的准确率还不及它额外的计算成本显著。
模型的训练使用4块并行计算,把每一个batch的图像输入不同的GPU进行梯度计算,梯度和参数在GPU之间都是共享的,训练效果和在一块GPU上是类似的。但是通过这种方法加速了计算过程。训练一个卷积网络所用的时间大概在2-3周。
数据集采用了ILSVRC-2012数据集,这个数据集在ILSVRC 2012-2014比赛都在使用。数据集包含1000类图像:130万训练集、5万验证集和10万测试集。
根据表格3的内容,训练集上的尺度抖动能够显著提升模型在测试集上的表现。
通过测试发现,从A-E卷积网络深度增加错误率会下降。虽然C和D有相同的网络深度,但是C包含1×1卷积层,C的表现不如D。这证明虽然1×1卷积层增加了非线性过滤,但是通过卷积网络捕获空间上下文是更重要的。
通过将B中一对3×3的卷积层换成一个5×5的卷积层,模型表现反而下降了7%,证明更深的卷积网络和更小的感受野能够提升模型表现。


稠密评估方法和随机裁剪评估方法有互补性,在测试中随机裁剪略由于稠密评估,但是将两者的softmax结果进行平均后,效果要好于单独使用一种方法。

之前单独测试了每种卷积网络的表现,通过将多个模型的soft-max结果进行平均。从测试结果可以发现,融合D和E网络结构的结果,使用多裁剪和稠密评估结合后,模型表现再次提升。

通过对不同方法的不同卷积网络数量进行综合对比和比较,发现多个卷积网络融合后能够取得更好的效果。卷积网络融合的方法能提升大部分模型的表现。

通过评估发现,更深的卷积神经网络在大规模图像分类上表现很好。卷积网络的深度有益于分类准确度。此外,VGG模型有很好的泛化能力,能够在其他分类任务和数据集上表现良好。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: