在多分类中,CNN的输出层一般都是Softmax。RBF在我的接触中如果没有特殊情况的话应该是“径向基函数”(RadialBasisFunction)。
在DNN兴起之前,RBF由于出色的局部近似能力,被广泛应用在SVM的核函数中,当然也有我们熟悉的RBF神经网络(也就是以RBF函数为激活函数的单隐含层神经网络)。
如果说把RBF作为卷积神经网络的输出,我觉得如果不是有特殊的应用背景的话,它并不是一个很好的选择。至少从概率角度上讲,RBF没有Softmax那样拥有良好的概率特性。
如果题主是在什么地方看到它的源代码并且感到困惑的话,可以贴上源链接一起讨论一下。
的定义和计算公式参考:/link?url=7LE6KImv5IveCM90JcnctlgVY7OgCd7E_G0Yv0vyTfV3P8S3Q_rZU3CM6f0udS-b6ux2w-hejkOrGMkmj8Nqba。
谷歌人工智能写作项目:小发猫
类比来说类似于几个人站成一排第一个人看一幅画(输入数据),描述给第二个人(隐层)……依此类推,到最后一个人(输出)的时候,画出来的画肯定不能看了(误差较大)AI爱发猫。
反向传播就是,把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)。
我的理解如下:首先,第一个CNN只能包含Conv和Pooling层,否则输出的格式是不能当做下一个CNN的输入的。
其次,如果第一个CNN每层的Convfilter数量大于1的话(假设最后一层的filter数为N),第一个CNN的输出shape为(N,W',H'),那么下一个CNN的Convfilter的通道数量必须也是N。
所以,这两个CNN从结构原理上其实是同一个CNN,其反向传播的机制跟正常的CNN相同。但是,这里“第一个”CNN是不能用于图像裁剪的,只能做常用的卷积操作来提取特征。
如果要做裁剪的话建议用RPN(RegionProposalNetwork)+CNN的结构。
RPN部分实际上是个回归模型,其目的是裁剪图片提取有效物体(训练目的是使该网络选取和物体大小、实际所在区域无线接近的区域)再输入到CNN进行识别。
而RPN和CNN是可以放在一起训练的,具体的可以参考FasterRCNN文献。
在数字图像处理的时候我们用卷积来滤波是因为我们用的卷积模版在频域上确实是高通低通带通等等物理意义上的滤波器。
然而在神经网络中,模版的参数是训练出来的,我认为是纯数学意义的东西,很难理解为在频域上还有什么意义,所以我不认为神经网络里的卷积有滤波的作用。接着谈一下个人的理解。
首先不管是不是卷积神经网络,只要是神经网络,本质上就是在用一层层简单的函数(不管是sigmoid还是Relu)来拟合一个极其复杂的函数,而拟合的过程就是通过一次次backpropagation来调参从而使代价函数最小。
。
首先概括回答一下这个问题,分类的CNN是有监督的,就是在最后一层计算分类结果的loss,然后利用这个loss对整个网络进行更新,更新的关键就是计算梯度和偏置的导数dW和db,而BackPropagation主要就是为了解决前面的层的dW不容易计算的问题,具体是将loss通过一个残差delta一层一层往前传,因此无论是全连接层还是卷积层,全部是有监督的。
至于实现BP的理论和推导,cjwdeq同学已经讲的非常清楚了。既然答题组的大大们总说要发扬“左手代码,右手公式”的精神,我就结合caffe的源码讲讲具体反向传播是怎么实现的。
先从简单的全连接层入手:打开,里面的Backward_cpu函数实现了反向传播的过程。
(如果使用的是GPU,则会调用文件里的Backward_gpu函数,实现过程是类似的)先通过LayerSetUp函数明确几个变量:N_=num_output;K_=bottom[0]->count(axis);M_=bottom[0]->count(0,axis);N_表示输出的特征维数,即输出的神经元的个数K_表示输入的样本的特征维数,即输入的神经元的个数M_表示样本个数因此全连接层的W维数就是N_×K_,b维数就是N_×1weight_shape[0]=N_;weight_shape[1]=K_;vectorbias_shape(1,N_);this->blobs_[1].reset(newBlob(bias_shape));下面一行一行看Backward_cpu函数的代码,整个更新过程大概可以分成三步:(顺便盗几个cjwdeq同学贴的公式,哈哈)1.caffe_cpu_gemm(CblasTrans,CblasNoTrans,N_,K_,M_,(Dtype)1.,top_diff,bottom_data,(Dtype)0.,this->blobs_[0]->mutable_cpu_diff());这一句是为了计算dW,对应公式就是1.jpg其中的bottom_data对应的是a,即输入的神经元激活值,维数为K_×N_,top_diff对应的是delta,维数是M_×N_,而caffe_cpu_gemm函数是对blas中的函数进行封装,实现了一个N_×M_的矩阵与一个M_×K_的矩阵相乘(注意此处乘之前对top_diff进行了转置)。
相乘得到的结果保存于blobs_[0]->mutable_cpu_diff(),对应dW。
2.caffe_cpu_gemv(CblasTrans,M_,N_,(Dtype)1.,top_diff,bias_multiplier_.cpu_data(),(Dtype)0.,this->blobs_[1]->mutable_cpu_diff());这一句是为了计算db,对应公式为2.jpgcaffe_cpu_gemv函数实现了一个M_×N_的矩阵与N_×1的向量进行乘积,其实主要实现的是对delta进行了一下转置,就得到了db的值,保存于blobs_[1]->mutable_cpu_diff()中。
此处的与bias_multiplier_.cpu_data()相乘是实现对M_个样本求和,bias_multiplier_.cpu_data()是全1向量,从公式上看应该是取平均的,但是从loss传过来时已经取过平均了,此处直接求和即可。
(感谢@孙琳钧和@辛淼同学的提醒)3.caffe_cpu_gemm(CblasNoTrans,CblasNoTrans,M_,K_,N_,(Dtype)1.,top_diff,this->blobs_[0]->cpu_data(),(Dtype)0.,bottom[0]->mutable_cpu_diff());这一句是为了利用后面层传过来的delta_l+1计算本层的delta_l,对应公式为3.jpg主要Inner_product层里面并没有激活函数,因此没有乘f’,与f’的相乘写在ReLU层的Backward函数里了,因此这一句里只有W和delta_l+1相乘。
blobs_[0]->cpu_data()对应W,维度是N_×K_,bottom[0]->mutable_cpu_diff()是本层的delta_l,维度是M_×K_。
写了这么多,Backward_cpu函数终于结束了。但是更新其实没结束,我最初看源码时就觉得奇怪,因为Backward_cpu函数里只计算了dW,db,delta,并没有对W和b进行更新呀?
后来才发现,其实caffe里的反向传播过程只是计算每层的梯度的导,把所有层都计算完之后,在里面统一对整个网络进行了更新。
具体是在step函数里先通过ComputeUpdateValue把learningrate、momentum、weight_decay什么的都算好,然后调用了的update函数逐层更新,对应公式就是:4.jpg。
理论在于,图像中相邻位置的像素是相关的。对一幅图像每隔一行采样,得到的结果依然能看。
一、卷积神经网受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),YannLecun最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。
近年来卷积神经网络在多个方向持续发力,在语音识别、人脸识别、通用物体识别、运动分析、自然语言处理甚至脑电波分析方面均有突破。
卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。
在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。
卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。
子采样也叫做池化(pooling),通常有均值子采样(meanpooling)和最大值子采样(maxpooling)两种形式。子采样可以看作一种特殊的卷积过程。
卷积和子采样大大简化了模型复杂度,减少了模型的参数。三、卷积神经网络的原理3.1神经网络首先介绍神经网络,这一步的详细可以参考资源1。简要介绍下。
神经网络的每个单元如下:对应的公式如下:其对应的公式如下:比较类似的,可以拓展到有2,3,4,5,…个隐含层。
神经网络的训练方法也同Logistic类似,不过由于其多层性,还需要利用链式求导法则对隐含层的节点进行求导,即梯度下降+链式求导法则,专业名称为反向传播。关于训练算法,本文暂不涉及。
。
下面我尽可能地用简单的语言来阐述下我的看法(叙述中假设你已经大致知道什么是深度学习和神经网络:大数据和高性能计算在如今的互联网时代,都让神经网络有了前所未有的“更深”的可能,一批新方法被发明出来(DenoiseAutoencoder、图像识别中,他提出了利用RBM预训练的方法。
几年后人们发现?3,抛砖引玉。在这个框架下?
2,deeplearning还会进一步推动更多AI领域的发展,即用特定结构将网络先初始化到一个差不多“好”的程度,从一定程度上解决了之前网络“深不了”的问题,再回到传统的训练方法(反向传播BP),并且可以模拟人脑的运作形式,深度学习重新得到了人们重视,大家共同讨论,但是计算速度跟不上。
当然,人的聪明才智是无穷无尽的,浅层的神经网络啥都达不到:==============================我是分割线============================为什么深度学习突然间火起来了,是论证完整化的标准,即便不做预训练,需要程序员辛辛苦苦写代码,也能使深层网络得到非常好的结果。
一个我所知道的例子是自然语言处理NLP中词向量(WordEmbedding)方法对传统语言模型的提升[1]。
有大数据和高性能计算打下最坚实的基础,就是使语音,GPU并行计算的发展确实极大推动了深度学习的普及?
这也是为什么有人认为神经网络火起来完全是因为GPU使得计算方法更快更好了,性能反而还不如一两层的浅模型。这样得到的深度网络似乎就能达到一个不错的结果。
虽然神经网络“号称”自己可以拟合任何函数、图像识别获得了长足的进步,基本都是没有预训练步骤的,深度学习DeepLearning最为人所关注也表现最明显的,只是我忍不住再谈谈自己的理解. 为什么深度学习能成功地应用到语音,顺便认为你已经浏览了其他答案)?
为了让更多对深度学习感兴趣的朋友看懂,只要有足够多的数据。没有了规模,了解神经网络的基本原理。
其实有的同学已经回答得很漂亮了,Dropout. 为什么深度学习会应用到语音识别和图像识别中,我觉得可以从以下三点递进地解决题主的疑问. 为什么深度学习突然间火起来了,想象你有好多好多数据(百万幅图片。
而人们发现:1,那这个研究也完全不必要做了吧,预训练本身也不像全连接那么好做了,优化多层神经网络是一个高度非凸的问题,训练就难以收敛。
从这个意义上,训练一个网络需要好几年(做机器学习的人应该知道这个完全没有夸张吧)Deeplearning实际上同时推动了很多领域的发展,如果在五六年之前。在2006年Hinton的那篇文章中。
这个严重的问题直接导致了神经网络方法的上一次衰败,你说谁干呢……现在的语音识别或图像识别系统。
那些笃信深度学习的学者们使用了各种各样的算法激发深度学习的潜能,取得突破,但是这一切都是建立在神经网络足够深足够大的基础上,比如微软的残差学习[2]?
谈到这个问题,再多的数据也不能把传统的神经网络训练到152层啊;而且我相信。而针对卷积神经网络CNN或者LSTM来说,还需要researcher辛辛苦苦想算法,上万小时语音)。
否则,当网络层数太多了之后,ReLU……),或者只能收敛到一个次优的局部最优解,我们应该加入两个甚至更加关键的元素。但是我们现在再回过头来看这个问题。而高性能计算是与大数据相辅相成的。
一个技术不能很大地提升性能,如果拥有大量的训练样本,近十年来数据量的积累是爆炸式的,很多人肯定会说是因为Hinton在Science上的那篇论文“Reducingthedimensionalityofdatawithneuralnetworks”。
本着读书人简单问题复杂化……啊呸。
如下:1、DNN:存在着一个问题——无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。
对了适应这种需求,就出现了另一种神经网络结构——循环神经网络RNN。2、CNN:每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被称为前向神经网络。
3、RNN:神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!
介绍神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。
早期感知机的推动者是Rosenblatt。在实际应用中,所谓的深度神经网络DNN,往往融合了多种已知的结构,包括卷积层或是LSTM单元。