深度学习理论

深度学习理论

siamese network 训练数据如何处理,包括txt文件格式以及转lmdb格式。

深度学习应用cjwdeq 回复了问题 • 7 人关注 • 4 个回复 • 1683 次浏览 • 2 天前 • 来自相关话题

请问卷积神经网络中卷积网络和后面的全连接网络的分工是什么?

深度学习理论alex68 回复了问题 • 2 人关注 • 1 个回复 • 129 次浏览 • 2017-01-10 00:22 • 来自相关话题

在auto encoder中为什么要使用两个损失函数?sigmoidcrossentropyloss反向传播过程中出现问题

回复

深度学习理论Alien9427 发起了问题 • 1 人关注 • 0 个回复 • 109 次浏览 • 2017-01-04 17:30 • 来自相关话题

怎样用自己的数据集对caffe训练好的model进行fineture?

Caffe开发使用starzhou 回复了问题 • 17 人关注 • 6 个回复 • 4914 次浏览 • 2017-01-03 11:25 • 来自相关话题

关于局部对比归一化:Local contrast normalization

深度学习理论chenzhi1992 回复了问题 • 2 人关注 • 2 个回复 • 572 次浏览 • 2016-12-07 17:45 • 来自相关话题

学习率更新方法

参数调节emerald 回复了问题 • 2 人关注 • 1 个回复 • 261 次浏览 • 2016-11-10 16:27 • 来自相关话题

caffe 并行分类任务loss差距很大,求解?

图像分类naisubing 回复了问题 • 4 人关注 • 2 个回复 • 375 次浏览 • 2016-11-08 20:34 • 来自相关话题

请问有没有Caffe实现的Generative Adversarial Networks (GAN)

Caffe开发使用mywhuange 回复了问题 • 2 人关注 • 1 个回复 • 1048 次浏览 • 2016-11-01 00:55 • 来自相关话题

caffe在训练过程中可以不使用validation吗?不使用有什么坏处(或者说使用validation有什么好处)?

综合问题cooker 回复了问题 • 4 人关注 • 2 个回复 • 304 次浏览 • 2016-10-13 18:32 • 来自相关话题

训练集只含有一类样本A,如何利用这样的训练集构建模型,识别测试集中属于类A的样本。

深度学习应用YJango 回复了问题 • 3 人关注 • 2 个回复 • 240 次浏览 • 2016-10-13 14:09 • 来自相关话题

在CNN网络中roi从原图映射到feature map中的计算方法

深度学习理论南七骄傲 发表了文章 • 0 个评论 • 496 次浏览 • 2016-10-13 11:13 • 来自相关话题

在使用fast rcnn以及faster rcnn做检测任务的时候,涉及到从图像的roi区域到feature map中roi的映射,然后再进行roi_pooling之类的操作。
比如图像的大小是(600,800),在经过一系列的卷积以及pooling操作之后在某一个层中得到的feature map大小是(38,50),那么在原图中roi是(30,40,200,400),
在feature map中对应的roi区域应该是
roi_start_w = round(30 * spatial_scale);
roi_start_h = round(40 * spatial_scale);
roi_end_w = round(200 * spatial_scale);
roi_end_h = round(400 * spatial_scale);
其中spatial_scale的计算方式是spatial_scale=round(38/600)=round(50/800)=0.0625,所以在feature map中的roi区域[roi_start_w,roi_start_h,roi_end_w,roi_end_h]=[2,3,13,25];
具体的代码可以参见caffe中roi_pooling_layer.cpp 查看全部
在使用fast rcnn以及faster rcnn做检测任务的时候,涉及到从图像的roi区域到feature map中roi的映射,然后再进行roi_pooling之类的操作。
比如图像的大小是(600,800),在经过一系列的卷积以及pooling操作之后在某一个层中得到的feature map大小是(38,50),那么在原图中roi是(30,40,200,400),
在feature map中对应的roi区域应该是
roi_start_w = round(30 * spatial_scale);
roi_start_h = round(40 * spatial_scale);
roi_end_w = round(200 * spatial_scale);
roi_end_h = round(400 * spatial_scale);
其中spatial_scale的计算方式是spatial_scale=round(38/600)=round(50/800)=0.0625,所以在feature map中的roi区域[roi_start_w,roi_start_h,roi_end_w,roi_end_h]=[2,3,13,25];
具体的代码可以参见caffe中roi_pooling_layer.cpp

卷积核的理解

深度学习应用YJango 回复了问题 • 8 人关注 • 3 个回复 • 737 次浏览 • 2016-10-12 23:08 • 来自相关话题

請問 tensorflow 的 auto gradient 能夠適用於所有的 loss function 嗎

综合问题YJango 回复了问题 • 3 人关注 • 3 个回复 • 219 次浏览 • 2016-10-09 19:19 • 来自相关话题

FNN,CNN,RNN的区别

回复

深度学习理论YJango 发起了问题 • 2 人关注 • 0 个回复 • 383 次浏览 • 2016-10-04 08:48 • 来自相关话题

caffe中的Scalelayer的使用

回复

深度学习应用李士林 发起了问题 • 1 人关注 • 0 个回复 • 198 次浏览 • 2016-09-30 11:02 • 来自相关话题

MNIST训练前的预处理,为什么用归一化,而不是0均值?

综合问题温南 回复了问题 • 4 人关注 • 3 个回复 • 273 次浏览 • 2016-09-24 15:00 • 来自相关话题

幾個關於 ssd 與 yolo 無法理解的地方

综合问题joshua_1988 回复了问题 • 5 人关注 • 3 个回复 • 886 次浏览 • 2016-09-23 20:38 • 来自相关话题

caffe hinge loss 的实现

回复

深度学习理论ecitTop 发起了问题 • 3 人关注 • 0 个回复 • 286 次浏览 • 2016-09-22 10:50 • 来自相关话题

求解一些caffe的名词解释

参数调节米想好昵称 回复了问题 • 3 人关注 • 1 个回复 • 341 次浏览 • 2016-09-13 16:41 • 来自相关话题

caffe中BatchNorm和Scale层各参数的意义

参数调节风林火山 回复了问题 • 4 人关注 • 2 个回复 • 2853 次浏览 • 2016-09-09 20:41 • 来自相关话题

条新动态, 点击查看
官方的资料里面已经讲的非常详细了,我再补充几点实际操作时需要注意的地方吧:
1. ImageNet原来是1k个类别,finetune时需要根据自己数据集的类别数重新设置fc8层的output数,且新的fc8层的blob_lr会设的大一些(比如10和20),是为... 显示全部 »
官方的资料里面已经讲的非常详细了,我再补充几点实际操作时需要注意的地方吧:
1. ImageNet原来是1k个类别,finetune时需要根据自己数据集的类别数重新设置fc8层的output数,且新的fc8层的blob_lr会设的大一些(比如10和20),是为了加快收敛。
2. 自己数据集的类别号从0开始,中间要连续(我师弟有次finetune数据集一直报错,后来发现他是二类分类,但是类别号设成了0和12)
3. 数据集记得打乱,不然很可能不收敛
4. 如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.01开始,如果出现loss=nan了就不断往小调整
5. 可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了
辛淼

辛淼 回答了问题 • 2015-12-23 12:00 • 8 个回复 不感兴趣

fine_tuning原理问题

赞同来自:

这是个很好的问题~
一般我们在训练from scratch的时候往往要在一些超大型的数据集上训练,一个目的是为了让训练得到的特征(尤其是底层特征)更加多样。而从genertive pre-training到discriminative fine-tuning的... 显示全部 »
这是个很好的问题~
一般我们在训练from scratch的时候往往要在一些超大型的数据集上训练,一个目的是为了让训练得到的特征(尤其是底层特征)更加多样。而从genertive pre-training到discriminative fine-tuning的过程是一个对泛化特征进行面向task的特化的过程。
如果把fine-tuning之后的特征可视化出来,我们会发现高层特征可能会发生一些有趣的变化,直接反映出你的task:
2
而底层的特征,可能并没有非常明显的变化(这里是有争议的,请保持审慎)。
那么是不是底层特征就没用呢?切实恰恰相反,底层特征非常重要,如果底层特征不够好,特征类型不够充分,很可能训练不出来好的高层抽象。这就是为什么需要在大规模数据集上进行genertive training的原因之一。

还有很多内容,先mark一下,有空再继续说~
 
================================================================

嗯嗯,我回来啦~
分享一篇NIPS2014上Bengio大神的文章供参考:
How transferable are features in deep neural networks?
14
ruirui_ICT

ruirui_ICT 回答了问题 • 2015-12-26 15:52 • 4 个回复 不感兴趣

caffe里面的误差的反向传播怎么实现来的?

赞同来自:

   首先概括回答一下这个问题,分类的CNN是有监督的,就是在最后一层计算分类结果的loss,然后利用这个loss对整个网络进行更新,更新的关键就是计算梯度和偏置的导数dW和db,而Back Propagation主要就是为了解决前面的层的dW不容易计算的问题... 显示全部 »
   首先概括回答一下这个问题,分类的CNN是有监督的,就是在最后一层计算分类结果的loss,然后利用这个loss对整个网络进行更新,更新的关键就是计算梯度和偏置的导数dW和db,而Back Propagation主要就是为了解决前面的层的dW不容易计算的问题,具体是将loss通过一个残差delta一层一层往前传,因此无论是全连接层还是卷积层,全部是有监督的。
   至于实现BP的理论和推导,cjwdeq同学已经讲的非常清楚了。既然答题组的大大们总说要发扬“左手代码,右手公式”的精神,我就结合caffe的源码讲讲具体反向传播是怎么实现的。先从简单的全连接层入手:
   打开Inner_product_layer.cpp,里面的Backward_cpu函数实现了反向传播的过程。(如果使用的是GPU,则会调用Inner_product_layer.cu文件里的Backward_gpu函数,实现过程是类似的)
   先通过LayerSetUp函数明确几个变量:[code]N_ = num_output;
K_ = bottom[0]->count(axis);
M_ = bottom ->count(0, axis); N_表示输出的特征维数,即输出的神经元的个数
K_表示输入的样本的特征维数,即输入的神经元的个数
M_表示样本个数
因此全连接层的W维数就是N_×K_,b维数就是N_×1[code]weight_shape[0] = N_;
weight_shape[1] = K_;
vector<int> bias_shape(1, N_);
this->blobs_ .reset(new Blob<Dtype>(bias_shape)); 下面一行一行看Backward_cpu函数的代码,整个更新过程大概可以分成三步:(顺便盗几个cjwdeq同学贴的公式,哈哈)
1.[code]caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1.,
top_diff, bottom_data, (Dtype)0., this->blobs_ ->mutable_cpu_diff()); 这一句是为了计算dW,对应公式就是

35
 
 
其中的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.[code]caffe_cpu_gemv<Dtype>(CblasTrans, M_, N_, (Dtype)1., top_diff,
bias_multiplier_.cpu_data(), (Dtype)0.,
this->blobs_ ->mutable_cpu_diff()); 这一句是为了计算db,对应公式为

37
caffe_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.[code]caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1.,
top_diff, this->blobs_[0]->cpu_data(), (Dtype)0.,
bottom ->mutable_cpu_diff()); 这一句是为了利用后面层传过来的delta_l+1计算本层的delta_l,对应公式为

34
主要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里的反向传播过程只是计算每层的梯度的导,把所有层都计算完之后,在solver.cpp里面统一对整个网络进行了更新。具体是在step函数里先通过ComputeUpdateValue把learning rate、momentum、weight_decay什么的都算好,然后调用了Net.cpp的update函数逐层更新,对应公式就是:

36
 
    以上基本就是整个全连接层的更新过程,卷积层的过程类似。(不过我当初看源码的时候偷懒,卷积层的没认真看,我打算借这个机会回去仔细看一下,过几天回来再写^_^)
    如果哪些地方写的不对,欢迎同学们指正~
 
 
    谢邀。
    先说是不是,再说为什么。
    首先给出一个答案供参考:当前(公元2014.01~公元2015.12)被广泛使用的CNN模型,绝大多数都不再使用“逐层预训练”方式进行初始化。注意,是“不再”。
    为什么这样说呢?
    在回答... 显示全部 »
    谢邀。
    先说是不是,再说为什么。
    首先给出一个答案供参考:当前(公元2014.01~公元2015.12)被广泛使用的CNN模型,绝大多数都不再使用“逐层预训练”方式进行初始化。注意,是“不再”。
    为什么这样说呢?
    在回答之前,首先必须要懂的一个道理: 许多问题,以及问题解决办法的提出都是有历史背景的 ,一个好的办法并不永远都是好的,而是因为在当时的历史背景下解决了当时的问题。“逐层预训练”就是这个的集中体现,同样的道理也可参考LSTM。
    逐层预训练面对的问题是,在当时的历史条件下(ReLU还未提出、稀疏火的一塌糊涂),如何解决训练深度网络的问题。
    如果明白了这个道理,你就明白了为什么后来不再用逐层预训练了:新一代激活函数、dropout等等。而现在,由于一些指导性理论的提出,把网络轻松搞到几十层甚至上百层已不是梦。目前你看到的一些文章中的“pre-training”,已经和那个时期的不是一个意思了,大多数时候是对应于“fine-turnin”来说的(这是后话了)。
    题主的问题我猜应该是先看了一些早期深度学习的介绍(大概在08年左右?),但也许你了解的仍不够早。所谓博古才能通今,就是这个道理。推荐你看一篇综述,关于深度学习的年鉴:
    Schmidhuber J. Deep Learning in Neural Networks: An Overview[J]. Neural Networks, 2014, 61:85–117.
   
    另外请参考这个问题:
   “无监督学习是否被监督学习取代了?” - http://caffecn.cn/?/question/4

    以上~
 
ruirui_ICT

ruirui_ICT 回答了问题 • 2016-01-26 22:19 • 6 个回复 不感兴趣

1X1卷积核到底有什么作用呢?

赞同来自:

我来说说我的理解,我认为1×1的卷积大概有两个方面的作用吧:
1. 实现跨通道的交互和信息整合
2. 进行卷积核通道数的降维和升维
 
下面详细解释一下:
1. 这一点孙琳钧童鞋讲的很清楚。1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄... 显示全部 »
我来说说我的理解,我认为1×1的卷积大概有两个方面的作用吧:
1. 实现跨通道的交互和信息整合
2. 进行卷积核通道数的降维和升维
 
下面详细解释一下:
1. 这一点孙琳钧童鞋讲的很清楚。1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,认为文中提出的MLP其实等价于在传统卷积核后面接cccp层,从而实现多个feature map的线性组合,实现跨通道的信息整合。而cccp层是等价于1×1卷积的,因此细看NIN的caffe实现,就是在每个传统卷积层后面接了两个cccp层(其实就是接了两个1×1的卷积层)。
2. 进行降维和升维引起人们重视的(可能)是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。
75
最近大热的MSRA的ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少,如下图的结构。(不然真不敢想象152层的网络要怎么跑起来TAT)
76
 
(针对最近大大们头疼的侵权问题,在这里弱弱的加一句:本内容为本人原创,仅授权给CaffeCN社区(caffecn.cn)使用,如需转载须注明转载来源。(⊙v⊙))

为什么要用activation functions?

深度学习理论南七骄傲 回复了问题 • 11 人关注 • 3 个回复 • 1465 次浏览 • 2016-08-09 09:14 • 来自相关话题

谷歌的一些Inception Model?

深度学习理论ricky 回复了问题 • 18 人关注 • 3 个回复 • 4482 次浏览 • 2016-05-28 10:04 • 来自相关话题

梯度爆炸和梯度消失

深度学习理论YJango 回复了问题 • 10 人关注 • 1 个回复 • 2844 次浏览 • 2016-03-10 17:46 • 来自相关话题

caffe里面的误差的反向传播怎么实现来的?

Caffe开发使用王蒙蒙 回复了问题 • 29 人关注 • 4 个回复 • 3016 次浏览 • 2016-01-10 15:55 • 来自相关话题

siamese network 训练数据如何处理,包括txt文件格式以及转lmdb格式。

回复

深度学习应用cjwdeq 回复了问题 • 7 人关注 • 4 个回复 • 1683 次浏览 • 2 天前 • 来自相关话题

请问卷积神经网络中卷积网络和后面的全连接网络的分工是什么?

回复

深度学习理论alex68 回复了问题 • 2 人关注 • 1 个回复 • 129 次浏览 • 2017-01-10 00:22 • 来自相关话题

在auto encoder中为什么要使用两个损失函数?sigmoidcrossentropyloss反向传播过程中出现问题

回复

深度学习理论Alien9427 发起了问题 • 1 人关注 • 0 个回复 • 109 次浏览 • 2017-01-04 17:30 • 来自相关话题

怎样用自己的数据集对caffe训练好的model进行fineture?

回复

Caffe开发使用starzhou 回复了问题 • 17 人关注 • 6 个回复 • 4914 次浏览 • 2017-01-03 11:25 • 来自相关话题

关于局部对比归一化:Local contrast normalization

回复

深度学习理论chenzhi1992 回复了问题 • 2 人关注 • 2 个回复 • 572 次浏览 • 2016-12-07 17:45 • 来自相关话题

学习率更新方法

回复

参数调节emerald 回复了问题 • 2 人关注 • 1 个回复 • 261 次浏览 • 2016-11-10 16:27 • 来自相关话题

caffe 并行分类任务loss差距很大,求解?

回复

图像分类naisubing 回复了问题 • 4 人关注 • 2 个回复 • 375 次浏览 • 2016-11-08 20:34 • 来自相关话题

请问有没有Caffe实现的Generative Adversarial Networks (GAN)

回复

Caffe开发使用mywhuange 回复了问题 • 2 人关注 • 1 个回复 • 1048 次浏览 • 2016-11-01 00:55 • 来自相关话题

caffe在训练过程中可以不使用validation吗?不使用有什么坏处(或者说使用validation有什么好处)?

回复

综合问题cooker 回复了问题 • 4 人关注 • 2 个回复 • 304 次浏览 • 2016-10-13 18:32 • 来自相关话题

训练集只含有一类样本A,如何利用这样的训练集构建模型,识别测试集中属于类A的样本。

回复

深度学习应用YJango 回复了问题 • 3 人关注 • 2 个回复 • 240 次浏览 • 2016-10-13 14:09 • 来自相关话题

卷积核的理解

回复

深度学习应用YJango 回复了问题 • 8 人关注 • 3 个回复 • 737 次浏览 • 2016-10-12 23:08 • 来自相关话题

請問 tensorflow 的 auto gradient 能夠適用於所有的 loss function 嗎

回复

综合问题YJango 回复了问题 • 3 人关注 • 3 个回复 • 219 次浏览 • 2016-10-09 19:19 • 来自相关话题

FNN,CNN,RNN的区别

回复

深度学习理论YJango 发起了问题 • 2 人关注 • 0 个回复 • 383 次浏览 • 2016-10-04 08:48 • 来自相关话题

caffe中的Scalelayer的使用

回复

深度学习应用李士林 发起了问题 • 1 人关注 • 0 个回复 • 198 次浏览 • 2016-09-30 11:02 • 来自相关话题

MNIST训练前的预处理,为什么用归一化,而不是0均值?

回复

综合问题温南 回复了问题 • 4 人关注 • 3 个回复 • 273 次浏览 • 2016-09-24 15:00 • 来自相关话题

幾個關於 ssd 與 yolo 無法理解的地方

回复

综合问题joshua_1988 回复了问题 • 5 人关注 • 3 个回复 • 886 次浏览 • 2016-09-23 20:38 • 来自相关话题

caffe hinge loss 的实现

回复

深度学习理论ecitTop 发起了问题 • 3 人关注 • 0 个回复 • 286 次浏览 • 2016-09-22 10:50 • 来自相关话题

求解一些caffe的名词解释

回复

参数调节米想好昵称 回复了问题 • 3 人关注 • 1 个回复 • 341 次浏览 • 2016-09-13 16:41 • 来自相关话题

caffe中BatchNorm和Scale层各参数的意义

回复

参数调节风林火山 回复了问题 • 4 人关注 • 2 个回复 • 2853 次浏览 • 2016-09-09 20:41 • 来自相关话题

问一下为什么cifar10和imagenet的data layer里面没有scale,将0到255归一化成0到1?

回复

深度学习理论maoseeker 回复了问题 • 1 人关注 • 1 个回复 • 294 次浏览 • 2016-09-07 16:59 • 来自相关话题

在CNN网络中roi从原图映射到feature map中的计算方法

深度学习理论南七骄傲 发表了文章 • 0 个评论 • 496 次浏览 • 2016-10-13 11:13 • 来自相关话题

在使用fast rcnn以及faster rcnn做检测任务的时候,涉及到从图像的roi区域到feature map中roi的映射,然后再进行roi_pooling之类的操作。
比如图像的大小是(600,800),在经过一系列的卷积以及pooling操作之后在某一个层中得到的feature map大小是(38,50),那么在原图中roi是(30,40,200,400),
在feature map中对应的roi区域应该是
roi_start_w = round(30 * spatial_scale);
roi_start_h = round(40 * spatial_scale);
roi_end_w = round(200 * spatial_scale);
roi_end_h = round(400 * spatial_scale);
其中spatial_scale的计算方式是spatial_scale=round(38/600)=round(50/800)=0.0625,所以在feature map中的roi区域[roi_start_w,roi_start_h,roi_end_w,roi_end_h]=[2,3,13,25];
具体的代码可以参见caffe中roi_pooling_layer.cpp 查看全部
在使用fast rcnn以及faster rcnn做检测任务的时候,涉及到从图像的roi区域到feature map中roi的映射,然后再进行roi_pooling之类的操作。
比如图像的大小是(600,800),在经过一系列的卷积以及pooling操作之后在某一个层中得到的feature map大小是(38,50),那么在原图中roi是(30,40,200,400),
在feature map中对应的roi区域应该是
roi_start_w = round(30 * spatial_scale);
roi_start_h = round(40 * spatial_scale);
roi_end_w = round(200 * spatial_scale);
roi_end_h = round(400 * spatial_scale);
其中spatial_scale的计算方式是spatial_scale=round(38/600)=round(50/800)=0.0625,所以在feature map中的roi区域[roi_start_w,roi_start_h,roi_end_w,roi_end_h]=[2,3,13,25];
具体的代码可以参见caffe中roi_pooling_layer.cpp

如何理解矩阵

深度学习理论YJango 发表了文章 • 3 个评论 • 747 次浏览 • 2016-05-03 17:07 • 来自相关话题

空间:能够容纳运动是作为空间的基本条件。线性代数第一个引入的概念便是向量空间:一个描述状态的空间(注意要和用于描述位置的空间区分开来)

维度:互不相关的因素的个数是一个向量空间的维度。维度永远是用于描述空间的,而不是描述一个具体的向量。人们常说的n维向量实际是指n维向量空间内的向量,由于向量没有指定任何实质的值,所以可以是任何值,因此其真正描述的依旧是一个空间。并且,选择的维度是一个站在观察者角度,希望在某个向量空间下可以尽可能的描述一个物体的状态而选择的,并非被描述者真实处在的空间。

矩阵:矩阵不同于一个向量,其描述的概念绝大多数情况都是具体的数值,是用于描述向量空间内的状态和动因的媒介。需要用两种观察角度去思考其包含的信息:静态和动态。
静态:静态包含两个信息。其一,包含多个在其所在维度空间下的向量,可以理解为 坐标; 其二,是坐标系。动态:用一个矩阵乘以另一个量的实质是通过线性变换改变另一个量的状态,可以理解为:外力。

矩阵乘法:当矩阵用来做乘法的时候,其包含的静态信息中的坐标信息又可以以两种视角来理解,若干个向量和若干组权重。当把矩阵内的每一行作为一个向量时,那么做乘法时,前一个矩阵装载着向量信息,后一个矩阵装载着权重信息;若把矩阵内的每一列作为向量看待的话,那么做乘法时,前一个矩阵装载着权重信息,后一个矩阵装载着向量信息。矩阵乘法其实可以理解为对向量空间内的某种状态产生了外力,改变了其原来的状态。
矩阵乘以矩阵:是将具体的若干个向量,以相同的方式进行线性变换(通过乘以权重并相加获得新的状态)。矩阵乘以向量:当没有给向量确定任何具体的数值时,一个矩阵乘以一个向量的式子实际是在描述从矩阵的(行or列)向量空间转换到(列or行)的向量空间。

矩阵转置:交换向量和权重的角色;或理解为矩阵的行、列空间的互换。

先简单概括到这里。真正想要理解的话,需要结合很多例子说明。 查看全部
空间:能够容纳运动是作为空间的基本条件。线性代数第一个引入的概念便是向量空间:一个描述状态的空间(注意要和用于描述位置的空间区分开来)

维度:互不相关的因素的个数是一个向量空间的维度。维度永远是用于描述空间的,而不是描述一个具体的向量。人们常说的n维向量实际是指n维向量空间内的向量,由于向量没有指定任何实质的值,所以可以是任何值,因此其真正描述的依旧是一个空间。并且,选择的维度是一个站在观察者角度,希望在某个向量空间下可以尽可能的描述一个物体的状态而选择的,并非被描述者真实处在的空间。

矩阵:矩阵不同于一个向量,其描述的概念绝大多数情况都是具体的数值,是用于描述向量空间内的状态和动因的媒介。需要用两种观察角度去思考其包含的信息:静态和动态。
  1. 静态:静态包含两个信息。其一,包含多个在其所在维度空间下的向量,可以理解为 坐标; 其二,是坐标系。
  2. 动态:用一个矩阵乘以另一个量的实质是通过线性变换改变另一个量的状态,可以理解为:外力。


矩阵乘法:当矩阵用来做乘法的时候,其包含的静态信息中的坐标信息又可以以两种视角来理解,若干个向量和若干组权重。当把矩阵内的每一行作为一个向量时,那么做乘法时,前一个矩阵装载着向量信息,后一个矩阵装载着权重信息;若把矩阵内的每一列作为向量看待的话,那么做乘法时,前一个矩阵装载着权重信息,后一个矩阵装载着向量信息。矩阵乘法其实可以理解为对向量空间内的某种状态产生了外力,改变了其原来的状态。
  1. 矩阵乘以矩阵:是将具体的若干个向量,以相同的方式进行线性变换(通过乘以权重并相加获得新的状态)。
  2. 矩阵乘以向量:当没有给向量确定任何具体的数值时,一个矩阵乘以一个向量的式子实际是在描述从矩阵的(行or列)向量空间转换到(列or行)的向量空间。


矩阵转置:交换向量和权重的角色;或理解为矩阵的行、列空间的互换。

先简单概括到这里。真正想要理解的话,需要结合很多例子说明。
深度学习理论方面相关问题