训练rbm 需要keras finetunee吗

博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)院领导集体
中国科学院大学
上海科技大学
《中国科学院院刊》(中文版)是中国科学院主办的以战略与决策研究为主的科技综...
《科学通报》是自然科学综合性学术刊物,力求及时报道自然科学各领域具有创新性...
覆盖数学、物理、化学、生命科学、地球科学、信息科学、技术科学与天文学等学科...
近几年,电信诈骗层出不穷,日益猖獗,不仅造成了人民群众钱...
中国自古就有“民以食为天”的说法,“吃”可谓是头等大事,...
作为“天宫一号”的“继承者”,天宫二号即将进行的各类实验...
我国首颗微重力科学实验卫星——“实践十号”已于...
博士娱乐场:俄议员:俄杜马支持朝韩代表团在圣彼得堡会谈
我要分享 &
文章来源:厦大原网&&&&发布时间:&&【字号:&&&&&&】
另外,由于QV4000会智能化的调节快门速度,未必是整数,但我为了行文方便,和新手容易理解,都一律取整了。可能不是好的实验精神,不过我们的目的也不是证明什么,而是普及知识么。用曲线和圆线时,多为了强调画面的纵深感和动感使画面结构更加丰富更富有艺术性。 线条的形式看起来好象很复杂,实际上只有进一步归纳起来,它只不过仅有直线和曲线两大类,直线包括着垂直线立平线和斜线。博士娱乐场调查显示,在各职业培训类别中,选择学历认证类的人数最多,比例超过四分之一,达到26.95%。这说明很多人希望通过职业培训的方式获得学历认证。此外管理类及财务类课程也比较受欢迎。
A、首先要抓取一些富有地方特征、时代特征的景物作背景,明显地交代出事件发生的时间、地点和时代气氛,以加深观众对作品主题的理解,抓取其有时代特征的景物,使人们了解时代背景。黄金分割应用到摄影构图技法上,同样具有强烈的审美价值。在决定拍摄对象主体的位置时,可以参考黄金分割定律,将其安排在画面中心偏左或偏右一点的位置,避免放置画面中心,可使照片耐看又不失平衡感。
对于解混响,同样可以使用基于频谱映射的方法。解混响中也需要生成训练数据,但不同于带噪语音生成时做时域的相加,带混响的语音是在时域上进行卷积;同样都把干净语音作为带标注数据。在阳光的照耀之下,枯木在湖面的倒影也更加清晰可见,平静的倒影画面相当动人。但须注意的是,愈远离岸边与树林的阻碍,风势会因地势空旷而较强,使得水面因此而产生较大涟漪,并破坏倒影的形状。
启动仪式上,最受市民欢迎便是传统的舞狮节目。伴着喧闹的锣鼓声,市民纷纷围拢在仁威广场,看舞狮队表演舞狮,看到精彩处,观众席中发出掌声阵阵。许多市民在观看中举着相机为舞狮队拍照录像。由于80后的年轻父母渐成"气候",家长本身的英语水平相比以往已经有了很大提高。父母们在日常对话中,就可以了解孩子的学习效果。根据调查显示,有44%的家长表示通过日常会话来了解孩子的英语水平。博士娱乐场第一类模型是多层感知机,DNN,可以先做RBM预训练,再做微调(fine-tune);不过文仕学介绍,他们团队通过实验发现,在大数据集上不需要预训练也可以收敛。
(责任编辑:乙顺辛建)博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)实现在Theano中实现DBNs,我们使用在受限伯尔曼机种定义的类。可以看到DBN的代码与SdA非常相似,因为两者都涉及非监督层际预训练后进行深度MLP的有监督细调。主要不同是使用RBM类而不是dA类。我们首先定义DBN类,它将储存MLP的层和相应的RBMs。既然我们使用RBMs来初始化MLP,代码尽可能的区分用来初始化网络的RBMs和用来分类的MLP。class DBN(object):
"""Deep Belief Network
A deep belief network is obtained by stacking several RBMs on top of each
other. The hidden layer of the RBM at layer `i` becomes the input of the
RBM at layer `i+1`. The first layer RBM gets as input the input of the
network, and the hidden layer of the last RBM represents the output. When
used for classification, the DBN is treated as a MLP, by adding a logistic
regression layer on top.
def __init__(self, numpy_rng, theano_rng=None, n_ins=784,
hidden_layers_sizes=[500, 500], n_outs=10):
"""This class is made to support a variable number of layers.
:type numpy_rng: numpy.random.RandomState
:param numpy_rng: numpy random number generator used to draw initial
:type theano_rng: theano.tensor.shared_randomstreams.RandomStreams
:param theano_rng: The if None is given one is
generated based on a seed drawn from `rng`
:type n_ins: int
:param n_ins: dimension of the input to the DBN
:type hidden_layers_sizes: list of ints
:param hidden_layers_sizes: intermediate layers size, must contain
at least one value
:type n_outs: int
:param n_outs: dimension of the output of the network
self.sigmoid_layers = []
self.rbm_layers = []
self.params = []
self.n_layers = len(hidden_layers_sizes)
assert self.n_layers & 0
if not theano_rng:
theano_rng = MRG_RandomStreams(numpy_rng.randint(2 ** 30))
# allocate symbolic variables for the data
# the data is presented as rasterized images
self.x = T.matrix('x')
# the labels are presented as 1D vector of [int] labels
self.y = T.ivector('y')
self.sigmoid_layers将储存前项传递图,用来构建MLP,而self.rbm_layers将储存用来预训练MLP每层的RBMs。下一步我们构建n_layers sigmoid层(我们使用多层感知机里引入的HiddenLayer类,仅把其中非线性部分从tanh改为逻辑函数)和n_layers RBMs,n_layers是模型的深度。我们把sigmoid鞥连接起来构建MLP,并以共享权重矩阵和相应sigmoid层隐藏偏差的方式来构建RBM。
for i in range(self.n_layers):
# construct the sigmoidal layer
# the size of the input is either the number of hidden
# units of the layer below or the input size if we are on
# the first layer
if i == 0:
input_size = n_ins
input_size = hidden_layers_sizes[i - 1]
# the input to this layer is either the activation of the
# hidden layer below or the input of the DBN if you are on
# the first layer
if i == 0:
layer_input = self.x
layer_input = self.sigmoid_layers[-1].output
sigmoid_layer = HiddenLayer(rng=numpy_rng,
input=layer_input,
n_in=input_size,
n_out=hidden_layers_sizes[i],
activation=T.nnet.sigmoid)
# add the layer to our list of layers
self.sigmoid_layers.append(sigmoid_layer)
# its arguably a philosophical question...
but we are
# going to only declare that the parameters of the
# sigmoid_layers are parameters of the DBN. The visible
# biases in the RBM are parameters of those RBMs, but not
# of the DBN.
self.params.extend(sigmoid_layer.params)
# Construct an RBM that shared weights with this layer
rbm_layer = RBM(numpy_rng=numpy_rng,
theano_rng=theano_rng,
input=layer_input,
n_visible=input_size,
n_hidden=hidden_layers_sizes[i],
W=sigmoid_layer.W,
hbias=sigmoid_layer.b)
self.rbm_layers.append(rbm_layer)
然后我们将最后的逻辑回归层堆叠上去。我们使用逻辑回归里介绍的LogisticRegression类。
self.logLayer = LogisticRegression(
input=self.sigmoid_layers[-1].output,
n_in=hidden_layers_sizes[-1],
n_out=n_outs)
self.params.extend(self.logLayer.params)
# compute the cost for second phase of training, defined as the
# negative log likelihood of the logistic regression (output) layer
self.finetune_cost = self.logLayer.negative_log_likelihood(self.y)
# compute the gradients with respect to the model parameters
# symbolic variable that points to the number of errors made on the
# minibatch given by self.x and self.y
self.errors = self.logLayer.errors(self.y)
同时提供为每个RBMs生成训练函数的方法。他们作为列表返回,元素i是执行RBM第i层单步训练的函数。
def pretraining_functions(self, train_set_x, batch_size, k):
'''Generates a list of functions, for performing one step of
gradient descent at a given layer. The function will require
as input the minibatch index, and to train an RBM you just
need to iterate, calling the corresponding function on all
minibatch indexes.
:type train_set_x: theano.tensor.TensorType
:param train_set_x: Shared var. that contains all datapoints used
for training the RBM
:type batch_size: int
:param batch_size: size of a [mini]batch
:param k: number of Gibbs steps to do in CD-k / PCD-k
# index to a [mini]batch
index = T.lscalar('index')
# index to a minibatch
为了能在训练时更改训练速率,我们将Theano变量连接到默认值
learning_rate = T.scalar('lr')
# learning rate to use
# begining of a batch, given `index`
batch_begin = index * batch_size
# ending of a batch given `index`
batch_end = batch_begin + batch_size
pretrain_fns = []
for rbm in self.rbm_layers:
# get the cost and the updates list
# using CD-k here (persisent=None) for training each RBM.
# TODO: change cost function to reconstruction error
cost, updates = rbm.get_cost_updates(learning_rate,
persistent=None, k=k)
# compile the theano function
fn = theano.function(
inputs=[index, theano.In(learning_rate, value=0.1)],
outputs=cost,
updates=updates,
self.x: train_set_x[batch_begin:batch_end]
# append `fn` to the list of functions
pretrain_fns.append(fn)
return pretrain_fns
现在任一函数pretrain_fns[i]接受声明index和可选的lr-学习速率。同样的DBN类构建一个细调的方法函数。
def build_finetune_functions(self, datasets, batch_size, learning_rate):
'''Generates a function `train` that implements one step of
finetuning, a function `validate` that computes the error on a
batch from the validation set, and a function `test` that
computes the error on a batch from the testing set
:type datasets: list of pairs of theano.tensor.TensorType
:param datasets: It is a list that cont
the has to contain three pairs, `train`,
`valid`, `test` in this order, where each pair
is formed of two Theano variables, one for the
datapoints, the other for the labels
:type batch_size: int
:param batch_size: size of a minibatch
:type learning_rate: float
:param learning_rate: learning rate used during finetune stage
(train_set_x, train_set_y) = datasets[0]
(valid_set_x, valid_set_y) = datasets[1]
(test_set_x, test_set_y) = datasets[2]
# compute number of minibatches for training, validation and testing
n_valid_batches = valid_set_x.get_value(borrow=True).shape[0]
n_valid_batches //= batch_size
n_test_batches = test_set_x.get_value(borrow=True).shape[0]
n_test_batches //= batch_size
index = T.lscalar('index')
# index to a [mini]batch
# compute the gradients with respect to the model parameters
gparams = T.grad(self.finetune_cost, self.params)
# compute list of fine-tuning updates
updates = []
for param, gparam in zip(self.params, gparams):
updates.append((param, param - gparam * learning_rate))
train_fn = theano.function(
inputs=[index],
outputs=self.finetune_cost,
updates=updates,
self.x: train_set_x[
index * batch_size: (index + 1) * batch_size
self.y: train_set_y[
index * batch_size: (index + 1) * batch_size
test_score_i = theano.function(
self.errors,
self.x: test_set_x[
index * batch_size: (index + 1) * batch_size
self.y: test_set_y[
index * batch_size: (index + 1) * batch_size
valid_score_i = theano.function(
self.errors,
self.x: valid_set_x[
index * batch_size: (index + 1) * batch_size
self.y: valid_set_y[
index * batch_size: (index + 1) * batch_size
# Create a function that scans the entire validation set
def valid_score():
return [valid_score_i(i) for i in range(n_valid_batches)]
# Create a function that scans the entire test set
def test_score():
return [test_score_i(i) for i in range(n_test_batches)]
return train_fn, valid_score, test_score
注意返回的valid_score和test_score不是Theano函数而是Python函数。 0添加评论分享收藏本文作者山隹木又,本文首发于作者的知乎专栏《サイ桑的炼丹炉》, AI研习社获其授权发布。
卷积、池化等操作不再赘述,总结一下从LeNet到DenseNet的发展历程。
图1. LeNet-5 网络结构
一、LeNet-5
卷积神经网络的开山之作,麻雀虽小五脏俱全,卷积层、池化层、全链接层一直沿用至今。
这个网络结构非常简单,如图1所示。
层数很浅,并且kernel大小单一,C1、C3、C5三个卷积层使用的kernel大小全部都是5×5,不过在我个人看来,这个kernel的大小是经过了无数次实验得来的最优结果,并且有一定的特征提取能力,才能如此经得起时间的考验。C5的feature map大小为1×1是因为,S4的feature map大小为5×5而kernel大小与其相同,所以卷积的结果大小是1×1。
S2和S4两个池化层使用的window大小均为2×2,这里的池化有两种,一个是平均池化(在window内对所有数值求平均值),一个是最大池化(取window内的最大值)。
F6是一个有84个神经元的全连接层,猜测这个神经元数量也是实验所得较优的情况得来。
LeNet有一个很有趣的地方,就是S2层与C3层的连接方式。在原文里,这个方式称为“Locally Connect”,学习了CNN很久之后的一天,在回顾CNN原理的时候发现了这种神奇的连接方式:
图2. S2与C3层的局部连接
规定左上角为(0,0),右下角为(15,5),那么在(n,m)位置的“X”表示S2层的第m个feature map与C3层的第n个kernel进行卷积操作。例如说,C3层的第0个kernel只与S2层的前三个feature map有连接,与其余三个feature map是没有连接的;C3层的第15个kernel与S2层的所有feature map都有连接。这难道不就是ShuffleNet?
顺便分享一个很好的LeNet可视化项目:LeNet-5可视化(http://t.cn/RbmYJ5b)
二、AlexNet
图3. AlexNet结构图
AlexNet在2012年的ImageNet竞赛上以,比以往最低错误率低10个百分点的成绩夺冠。在介绍该网络的论文ImageNet Classification with Deep Convolutional Neural Networks(http://t.cn/RjKHKs0)中有很多干货:
一)、网络结构
网络一共有8层可学习层——5层卷积层和3层全链接层。网络的输入为150,528(224x224x3)维,各层的神经元数量为:
253,440=&186,624=&64,896=&64,896=&43,264=&=&1000(ImageNet有1000个类)
举个例子,计算一个186,624是怎么来的(如果有人会计算253,440,教えてください!):
27x27x256=186,624
举个例子,怎么计算feature map尺寸:
,224为输入大小,11为kernel大小,4为stride。
网络与之前的网络相比引入了以下新特征:
1、ReLU非线性单元:
激活函数的作用是为了引入非线性,这么说很抽象,但是在没有激活函数的时候,无论有多少层MLP,得到的网络输出依然是关于输入的线性函数,如下图所示:
传统的激活函数一般是sigmoid和tanh两种饱和非线性函数,就训练时间来说,使用这些饱和的非线性函数会比使用非饱和的非线性函数ReLU,模型收敛需要更长的时间。而对于大型的数据集来说,更快的学习过程意味着可以节省更多的时间。除此之外,ReLU也引入了一定的稀疏性,在特征表示的范畴内,数据有一定的稀疏性,也就是说,有一部分的数据其实是冗余的。通过引入ReLU,可以模拟这种稀疏性,以最大近似的方式来保留数据的特征。
2、多GPU训练
在论文给出的图3中我们可以看到,两个网络是并行的,但是这并不意味着AlexNet一定是并行结构的,这张图只是告诉我们,将AlexNet部署在多GPU上时的工作方式(为什么要部署在多GPU上?因为当时的GTX580只有3GB的显存,不足以容纳该网络最大的模型):每个GPU上并行地、分别地运行AlexNet的一部分(例如将4096个神经元的全连接层拆分为两个并行的2048个神经元的全连接层,第一个卷积层有96个feature map而在一块GPU上只有48个feature map等),两块GPU只在特定的层上有交互。
3、局部响应归一化层(Local Response Normalization Layer)
LRN层只存在于第一层卷积层和第二层卷积层的激活函数后面,引入这一层的主要目的,主要是为了防止过拟合,增加模型的泛化能力。具体方法是在某一确定位置(x,y)将前后各2/n个feature map求和作为下一层的输入。但是存在争论,说LRN Layer其实并没有什么效果,在这里不讨论。
4、Overlapping Pooling
池化操作提取的是一小部分的代表性特征,减少冗余信息。传统的卷积层中,相邻的池化单元是不重叠的,具体点说就是,对于一个8x8的feature map,如果池化的stride=2、window的size=2,我们得到的就是传统的池化操作。如果stride=2,window的size=3,那么在进行池化的过程中,相邻的池化window之间会有重叠的部分,这种池化就是overlapping pooling。论文也指出,这种池化只能“稍微”减轻过拟合。
二)、减轻过拟合
1、数据增强的两种方式:
1)、平移、翻转、对称等:
从256x256的图片中随机截取224x224的部分出来:
训练时,取出所有的patch以及它们的水平对称结果,这种操作将整个数据集放大了2048倍,为什么是2048倍呢?因为在vertical和horizontal两个方向上,各有32个位置可以进行crop,也就是32x32个patches。还有它们的horizontal reflection(水平对称),也就是再翻一番,所以,一张图片就可以获得2048个patches。
测试时,取四个角以及中心共五处的patch,加以对这些patch进行水平对称得到的patch来测试网络(一共是10个patches),也就是在预测时将10个patches逐一计算出softmax后的结果,再对所有的预测结果取平均,得到真正的分类。
2)、改变RGB通道的强度:
也就是,对每个RGB图片的像素变为:
这里的p和λ是RGB值3x3协方差矩阵的特征向量和特征值。α是均值为1标准差为0.1的高斯随机变量。
这么做的原因是利用了自然图片的一条重要性质:物体的鉴别特征并不会因为图片强度和颜色的变化而变化,也就是说,一定程度上改变图片的对比度、亮度、物体的颜色,并不会影响我们对物体的识别。在ImageNet上使用这个方法,降低了1%的top-1 error。
2、Dropout(自己的总结):
1)、Dropout是一种Bagging的近似:
Bagging定义k个不同的模型,从training set采样出k个不同的数据集,在第i个模型上用第i个数据集进行训练,最后综合k个模型的结果,获得最终的模型。但是需要的空间、时间都很大,在DNN中并不现实。
Dropout的目的是在指数级子网络的深度神经网络中近似Bagging。也就是说,在训练时,每次Dropout后,训练的网络是整个深度神经网络的其中一个子网络。在测试时,将dropout层取消,这样得到的前向传播结果其实就是若干个子网络前向传播综合结果的一种近似。
3、Learning rate decay:
随着训练的进行,逐渐减小学习率。
三、VGGNet(deep)
VGGNet与AlexNet很相似,都是卷积池化-卷积池化-...-全连接的套路,不同的是kernel大小,卷积stride,网络深度。
VGGNet将小卷积核带入人们的视线,分析一下大小卷积核的区别与优劣:
在上面提到的AlexNet中第一个卷积层使用的kernel大小为11x11,stride为4,C3和C5层中使用的都是5x5的卷积核;而出现在VGGNet中大多数的卷积核都是大小为3x3,stride为1的。
直观上我们会觉得大的卷积核更好,因为它可以提取到更大区域内的信息,但是实际上,大卷积核可以用多个小卷积核进行代替。例如,一个5x5的卷积核就可以用两个串联的3x3卷积核来代替,一个7x7的卷积核就可以用三个串联的3x3卷积核来代替。这样的替代方式有两点好处:
1、减少了参数个数:
两个串联的小卷积核需要3x3x2=18个参数,一个5x5的卷积核则有25个参数。
三个串联的小卷积核需要3x3x3=27个参数,一个7x7的卷积核则有49个参数。
大大减少了参数的数量。
2、引入了更多的非线性:
多少个串联的小卷积核就对应着多少次激活(activation)的过程,而一个大的卷积核就只有一次激活的过程。引入了更多的非线性变换,也就意味着模型的表达能力会更强,可以去拟合更高维的分布。
值得一提的是,VGGNet结构的C里面还用到了1x1的卷积核。但是这里对这种卷积核的使用并不是像Inception里面拿来对通道进行整合,模拟升维和降维,这里并没有改变通道数,所以可以理解为是进一步的引入非线性。
VGGNet相比于AlexNet层数更深,参数更多,但是却可以更快的收敛,在网上被解释为“更深的网络层数和更小的卷积核起到了隐式的正则化效果”,这句话读来让人一头雾水。我自己的解读是:更小的卷积和步长核使得在反向传播的过程中,kernel所需要考虑的loss来自于更多次的卷积,来自于整张feature map的更多patch,并且kernel自身需要更新的参数也变少了,这样梯度下降更新的方向就更加趋向于极值点,起到了一定的正则化作用;而更深的网络代表的是网络更强的表达能力,但是深的网络会引起梯度爆炸或者梯度消失,不知道网络的深度应该怎样与正则化联系起来,欢迎讨论。
原论文中还提到了一种新的测试方式,称作multi-scale testing,数据增强中也使用了multi-scale方法,不多介绍。
总地来说,VGGNet的出现让我们知道CNN的潜力无穷,并且越深的网络在分类问题上表现出来的性能越好,并不是越大的卷积核就越好,也不是越小的就越好,就VGGNet来看,3x3卷积核是最合理的。
四、GoogLeNet (Inception v1~v4, deeper)
一)、Inception v1
有了VGG的铺垫,人们开始意识到,为了更好的网络性能,那有一条途径就是加深网络的深度和宽度,但是太过于复杂,参数过多的模型就会使得模型在不够复杂的数据上倾向于过拟合,并且过多的参数意味着需要更多的算力,也就是需要更多的时间和更多的钱。
GoogLeNet的核心思想是:将全连接,甚至卷积中的局部连接,全部替换为稀疏连接。
1、生物神经系统中的连接是稀疏的;
2、如果一个数据集的概率分布可以由一个很大、很稀疏的深度神经网络表示时,那么通过,分析最后一层激活值的相关统计和对输出高度相关的神经元进行聚类,可以逐层地构建出一个最优网络拓扑结构。也就是说,一个深度稀疏网络可以被逐层简化,并且因为保留了网络的统计性质,其表达能力也没有被明显减弱。
但是由于计算机硬件计算稀疏数据的低效性,现在需要提出的是一种,既能保持网络结构的稀疏性,又能利用密集矩阵计算的高效性的方法。大量研究表明,可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,Inception应运而生。
上图结构是Inception的naive版本基本单元,为什么由这种模型stack起来的网络既保持了网络结构的稀疏性,又利用了密集矩阵计算的高效性?
稀疏性是指卷积运算的使用,因为卷积通常对应着一个非常稀疏的矩阵(一个几乎所有元素都为零的矩阵),怎么理解卷积的稀疏性呢?在传统的神经网络中,使用矩阵乘法来建立输入与输出之间的连接关系,其中参数矩阵中的每一个单独的参数都描述了一个输入单元和输出单元的交互,我们使用的kernel的尺寸是远远小于图片的尺寸的,在feature map中,一个神经元只受到少数输入单元的影响,这是不同于密集的全连接的,称之为卷积的稀疏性。
密集矩阵计算依然是存在的,Inception模块中的四个分支可以看作是较为稀疏的部分,但是拼接之后又成为一个大的密集矩阵。
这种基本模块使用了3种不同的卷积核,那么提取到的应该是3种不同尺度的特征,既有较为宏观的特征又有较为微观的特征,增加了特征的多样性。池化层在我的理解就是保留较为原始的输入信息。在模块的输出端将提取到的各种特征在channel维度上进行拼接,得到多尺度的特征。
但是这种naive的版本在进行5x5卷积的时候依然会消耗大量的算力,举个例子分析:
如果previous layer输出的feature map为100x100x128,假设naive版本的5x5卷积核共有256个,需要的参数就为128x5x5x256个。假设,在进行5x5的卷积之前,先进行一次1x1的卷积,那么参数量可以大大降低。假设1x1的卷积核共有32个,5x5的卷积核依然有256个,那么需要的参数量为128x1x1x32+32x5x5x256,为前一种方法的0.255倍。注意到,这里的1x1卷积是被拿来进行channel维度的整合(降维),而在之前VGG中提到的只是为了引入非线性,毫无疑问,这里不仅降低了计算量,并且增加了非线性,增强了网络的表达能力,是一举两得的事情。
改进版的Inception module如下:
GoogLeNet(Inception-V1)的结构图如下:
可以看到,GoogLeNet使用的是模块化堆积的方法。
论文中说:模型在分类器之前使用了平均池化来替代全连接层的idea来自于NIN,在最后加入一层全连接层的为了使得模型在其他数据集上进行finetune时更方便。作者们发现将全连接层替换为平均池化层后,top-1准确率(accuracy)上升了0.6%,虽然移除了全连接层,但是dropout依然很重要。
值得注意的是,网络中有三个softmax,这是为了减轻在深层网络反向传播时梯度消失的影响,也就是说,整个网络的loss是由三个softmax共同组成的,这样在反向传播的时候,即使最后一个softmax传播回来的梯度消失了,还有前两个softmax传播回来的梯度进行辅助。在对网络进行测试的时候,这两个额外的softmax将会被拿掉。这样不仅仅减轻了梯度消失的影响,而且加速了网络的收敛。
整个Inception-v1的参数设置如图:
可以看到,随着网络变深,卷积核的个数也在不断增加,这是因为越往后,网络提取到的特征越抽象(例如,人之于眼睛鼻子嘴巴是抽象的),而且每个抽象特征需要的卷积核尺寸也相应大,所以随着层数变深,较大卷积核的数量应当随之提升。
二)、Inception v2 & v3
在具体介绍与v1版本的区别之前我想先直观地说一下batch normalization,因为在v3版本中使用了BN。这是我自己在ipad上记的笔记:
Batch normalization解决的是一个Internal covariate shift问题,论文中将这个问题定义为在训练过程中由于网络参数的改变而引起的网络激活分布的改变。笔记中最后一点关于BN应该放在何处的问题,近段时间也有一些争议,比如这个链接里做的对比BN-before or after ReLU?(http://t.cn/RjKgxNM)结果是将BN放在ReLU后面会有更好的效果。求指点!
那么v2版本到底在哪里进行了改进呢?
首先,参考了前面提到的VGGNet用两个串联的3x3卷积替代一个5x5卷积的方法。
其次,引入非对称卷积。例如,将3x1的卷积和1x3的卷积串联起来,与直接进行3x3卷积的结果是等价的。这种卷积方式大大降低了参数量,从nxn降到了2xn,所以当n越大,降低得越多。但是也并不是适用于所有的卷积方式,论文说明,在实践中在feature map为12x12~20x20时效果较好,也就是在较深层使用时效果好,浅层不太行,并且使用7x1和1x7卷积的串联可以得到很好的效果。有兴趣可以自己查看论文:Rethinking the Inception Architecture for Computer Vision(http://t.cn/RjKevpW)。
文章在不同深度的网络使用了不同类型的inception module,三种模块如下图所示:
整个网络的结构如图所示:
网络在很深的层次才使用了含有非对称卷积的Inception module,比如在8x8这种分辨率最低的feature map才使用了第三种Inception module,其原因是,这些最粗糙的网格,最靠近网络的末端,对于这些深层的网络来说,最关键的一点是要产生高维的稀疏表示,所以这些深层更需要的是局部处理(比如1x1的卷积得出的是最稀疏的结果),第三种Inception module是这三种模型中可以得到最稀疏结果的模型。
在ImageNet上的测试结果为:
Inception-v2是最原汁原味的版本,下面的Inception-v2 RMSProp、Inception-v2 Label Smoothing、Inception-v2 Factorized7x7、Inception-v2 BN-auxiliary是经过了一系列改进后的结果,具体操作请参考论文。
"Inception-v3 = Inception-v2 + Factorization + Batch Normalization"
三)、Inception-v4 &Inception-ResNet-v2(建议先看第五部分ResNet):
我们先看Inception-ResNet-v2:
网络的结构如上图,下面我们看看如何与ResNet结合(主要体现在Inception-resnet-A\B\C模块里):
Inception-resnet-A
Inception-resnet-B
Inception-resnet-C
可见,对每个Inception-resnet模块而言,综合了之前版本的Inception模块版本和ResNet的残差单元。除此之外,Google还优化了一个性能与Inception-ResNet-v2相仿的Inception-v4版本,不多讨论,可以自行看论文,对每个Inception模块的优化情况。
下面是模型在ImageNet数据集上的测试结果:
组合模型:
五、ResNet
首先,我想以拙见说一说什么是残差:
残差的定义是,观测值与估计值之间的差距,显然残差网络里的残差与这个定义不同。
假设我们有一个identity,用x表示。同时我们有一种想要的映射H(x),并且希望可以由两层weight layer的传播来得到这种映射。那这样我们就得到了一个神经网络。但是,如果我们定义残差为F(x)=H(x)-x,并且希望用两层的weight layer的传播来拟合残差,那么我们想要得到的理想映射H(x)=F(x)+x。这就是残差网络的基本理念,网络学习的是去拟合残差,而不是直接拟合输入和输出直接的映射。
引入残差单元:
接下来放几张作者在ICML2016上解读残差网络的PPT:
也就是说,如果identity是最优的,它就是我们想要的理想映射,那么我们可以直接将F(x)的参数全部置零;如果identity和H(x)很相近,那么我们就可以通过学习残差来修正这种差别。这个箭头称作shortcut connection,idea来自于highway network的skip-connection。
残差网络的设计理念是:保持简洁+VGG-SYTLE+就是要深
分享一个翻译版本的论文:中文版残差网络论文(http://t.cn/RC0XKlr)
我又要放自己的笔记了,这是一篇分析为啥深度残差网络性能好的论文,并且提出了一种新的残差单元,Identity Mappings in Deep Residual Networks(http://t.cn/Rj9ARVM):
这里分析了为什么深度残差网络却没有因为网络加深而带来的梯度消失或者题都爆炸问题,因为残差结构的特殊性,在由loss对输入求导的时候,导数项会被分解为两个,而有一个直接对输入的导数项并不会消失,所以梯度一直存在。
因为之前提到的没有shorcut connection的网络里,考虑activation的位置没有什么意义。但是在有分支的残差网络里,因为存在着addition,那么和identity相加的值应该是激活前还是激活后的就值得考虑。这里比较了各种残差单元的优劣,也就是说,将identity先进行BN,再激活,再传入weight layer进行计算的效果是最优的。
ResNet可以逐渐加深,常用的有ResNet-50、ResNet-101、ResNet-152。像ResNet-1001这么庞大的model一般的GPU难以加载。这些模型的参数如图:
六、DenseNet
首先介绍什么是Dense Block:
如图所示的结构就叫作Dense Block,它包括输入层在内共有5层,H是BN+ReLU+3x3Conv的操作,并不改变feature map的大小。对于每一层来说,前面所有层的feature map都被直接拿来作为这一层的输入。growth rate就是除了输入层之外,每一层feature map的个数。它的目的是,使得block中的任意两层都能够直接”沟通“。
其实在Dense Block输出的地方还有一个bottleneck layer,在bottleneck layer中的操作是一个1x1的卷积,卷积核共有4k个,降低channel维度,也就是减少了模型的参数。
在transition layer中有进一步压缩的操作称为compression,减少百分之θ的feature map数量,论文中使用的θ=0.5。
然后介绍DenseNet的模型:
也就是说,DenseNet其实是由若干个Dense Block串联起来而得到的,在每个Dense Block之间有一个Convolution+Pooling的操作,也就是图1中的transition layer。transition layer存在的意义是实现池化,作者在论文中承认了pooling的重要性。
分析一下为什么会从ResNet发展到DenseNet:
借用论文里的话,ResNet直接通过"Summation"操作将特征加起来,一定程度上阻碍(impede)了网络中的信息流。DenseNet通过连接(concatenate)操作来结合feature map,并且每一层都与其他层有关系,都有”沟通“,这种方式使得信息流最大化。其实DenseNet中的dense connectivity就是一种升级版的shortcut connection,提升了网络的鲁棒性并且加快了学习速度。
DenseNet的各种模型结构如图:
图中的每个conv代表的都是BN+ReLU+Conv的一连贯操作。
不要等到算法出现accuracy不好、
loss很高、模型overfitting时,
才后悔没有好好掌握基础数学理论。
走稳机器学习第一步,夯实数学基础!
“线性代数及矩阵论、概率论与统计、凸优化”
3大数学基础课程,火热团购中!
关注 AI 研习社(okweiwu),回复1领取
【超过 1000G 神经网络 / AI / 大数据,教程,论文】
为什么ResNet和DenseNet可以这么深?
文章转载自网络,作者观点不代表本网站立场,如需处理请联系客服
AI研习社其它文章
AI 研习社按,机器学习研究者、Jetpac的 CTO、《The Public Data Handbook》和《The Big Data Glossary for O’Reilly》两本书的作者 Pete Warden最近在自己的个人博客上发表了一篇文章,讨论了机器学习领域令人头疼的模型的可重复性问题,广大研究人员们想必深有同感。
雷锋网按:本文为雷锋字幕组编译的论文解读短视频,原标题Transfer Learning vs Multitask Learning,作者为Ibrahim Sobh。翻译 | 李晶
编辑 | 吴璇训练深度神经网络是一个乏味的过程。更实际的方法,如重新使用训练好的网络解决其他任务,或针对许多任务使用相同的网络
本文作者为留德华叫兽&王源,原载于知乎专栏--『运筹OR帷幄』大数据人工智能时代的运筹学(http://t.cn/RlNoO3P),AI 研习社获其授权转载。前言本篇文章是由留德华叫兽在知乎的优秀回答改编扩展而成的, 作者留德华叫兽有着应用数学和硕士运筹学、优化理论的背景转
CCF-GAIR (CCF 全球人工智能与机器人峰会) 创立于 2016。过去两年来,我们先后邀请到 10 余位中美两国院士、20 余位 IEEE Fellow、近百位在各自专业领域享有盛誉的学者以及 AI 领域的知名企业家、投资者和创新者做了大会报告及相关圆桌分享,共吸引 5000 余位 AI 学者
雷锋网 AI 研习社按:日前,OpenAI 启动一项迁移学习比赛,这一比赛为期两个月(4 月 5 日-6 月 5 日),参赛者需要让智能体来玩风靡一时的 Sonic The Hedgehog(刺猬索尼克)游戏。这一比赛将会评出三大奖项,参赛者有机会获得丰厚奖励,并与 OpenAI 共同撰写比赛技术文
本文为雷锋字幕组编译的技术博客,原标题Deep Learning for text made easy with AllenNLP,作者为Déborah Mesquita。翻译 | 汪宁 徐玮
整理 | 凡江良好学习过程的关键原则之一,就是让学习的内容略高于当前的理解。如果该主题与你已知的内容太过于相似,那么你就不会
本文为雷锋字幕组编译的技术博客,原标题GAN with Keras: Application to Image Deblurring,作者为Rapha?l Meudec。翻译 | 廖颖 陈俊雅 整理 | 凡江2014年 Ian Goodfellow 提出了生成对抗网络(GAN)。这篇文章主要介绍在Keras中搭建GAN实现图像去模糊。所有的Keras代
Scikit-learn 是基于 Python 语言的机器学习工具。简单高效的数据挖掘和数据分析工具可供大家在各种环境中重复使用建立在 NumPy ,SciPy 和 matplotlib 上开源,可商业使用 - BSD许可证官网地址:scikit-learn(sklearn): http://scikit-learn.org中文文档:ApacheCN - s
人工智能是目前最受关注、最为火热的研究领域之一,随着企业在 AI 研究及相关应用落地的重视,相应的岗位需求也水涨船高。然而,这一行业仍然面临百万量级的人才缺口。雷锋网注意到,在 AI 人才需求的浪潮下,为争抢优秀人才,企业投入大量财力和人力招募和储备优秀的 A
本文为雷锋字幕组编译的技术博客,原标题Math, Stats and NLP for Machine Learning: As Fast As Possible,作者为Souman Roy。翻译 | 廖颖 龙珂宇 Noddleslee J叔
整理 | 凡江机器学习: 引言听过人们谈论过机器学习,但对它的概念却是一知半解?想要从零开始机器学习,
TFMA 是一个用于评估 TensorFlow 模型的库,它可以让用户使用 Trainer 里定义的指标以分布式方式评估大量数据的模型。这些指标也可以在不同的数据片里计算,其结果可以在Jupyter Notebooks 里可视化。TFMA 可能会在版本 1.0 之前引入后向不兼容的更改。Github:https://
写了 Python,补了微积分,学了概率统计,刷了李飞飞主讲的斯坦福 CS231n,满心欢喜地投身 AI 浪潮,准备开始大干一票,做那个别人口中“一毕业就年薪 30W+ 的”算法工程师。结果,发现连锅炉师傅和挖掘司机都闹着要转行做AI。这时你眉头一皱,发现事情并不简单,问自己
AI 研习社按:本文的作者是Thomas Treml,是一名具有社会学背景的数据科学自由职业者。他在 Medium 上分享了自己学习 deeplearning.ai 课程的经历与感想。由 AI 研习社进行编译。最近我刚刚完成了Andrew Ng(吴恩达)在Coursera上的deeplearning.ai的专业化课程,所以我
本文为雷锋字幕组编译的神经网络在线课(连载),原课程名为 Online Course On Neural Networks,由谷歌 AI 实验室主管 HugoLarochelle 授权翻译。Hugo Larochelle,曾是神经网络之父Geoffrey Hinton在多伦多大学的博士后,Yoshua Bengio在蒙特利尔的博士生,专攻计算机
ANN Visualizer 是一个很不错的 Python 库,兼容 Keras,它使用 Python 的graphviz 库来创建开发人员正在构建的神经网络的可视化图形。Github:https://github.com/Prodicode/ann-visualizer安装From Github从 Github 上下载 ann_visualizer 文件夹。将 ann_visualizer
AI 研习社按,在日前结束的 Kaggle「Statoil/C-CORE Iceberg Classifier Challenge」(冰山图像分类大赛)中,由 David Austin 和 Weimin Wang 组成的队伍一举拔得头筹,获得 25000 美元奖金。据介绍,他们的解决方案能有效应用于实际生活,保证舰船在危险的水域更加安全
TensorFlow.js 是谷歌在 2018 TensorFlow 开发者峰会推出的开源库,它可以使用 Java 和灵活且直观的 API 在浏览器中定义、训练和运行机器学习模型。另外,TensorFlow.js 可以导入离线训练的 TensorFlow 和 Keras 模型进行预测,并可以对 WebGL 实现无缝支持。在浏览器中
AWS 托管了各种公用数据集,且任何人都可以免费访问。过去,查找、下载、自定义和分析卫星图像或基因组数据等大型数据集需要几个小时或几天的时间。当数据在 AWS 上公开提供后,任何人都可以分析任意数量的数据,而无需自行下载或存储这些数据。您可以使用 AWS 计算和数
AI 研习社按,日前,由生物医学成像领域顶级学术会议 ISBI((IEEE International Symposium on Biomedical Imaging)举办的 IDRiD 眼底图分析竞赛成绩揭晓。从排行榜上可以看到,来自中国的研究机构表现相当亮眼 —— 科大讯飞「iFLYTEK-MIG」团队在病灶分割比赛的 MA(
AI 研习社按,对于广大深度学习开发者来说, 迎来一个重大消息——Caffe2 代码并入 PyTorch 库。在 Caffe2 的GitHub(https://github.com/caffe2/caffe2)上可以看到如下说明,Source code now lives in the PyTorch repository.作为 Caffe2 作者,现在任职于 Facebook

我要回帖

更多关于 tensorflow finetune 的文章

 

随机推荐