2016-07-26 39 views

回答

7

根据Crop layer documentation,它需要两个底部斑点并输出一个顶部斑点。我们称底部斑点为AB,顶部斑点为T

A -> 32 x 3 x 224 x 224 
B -> 32 x m x n x p 

然后,

T -> 32 x m x n x p 

关于轴参数,从文档:

注意到一个Blob和裁剪,由第二输入斑点指定的形状,在所有尺寸后指定的轴。

这意味着,如果我们设置axis = 1,那么它会裁剪尺寸1,2,3,如果axis = 2,然后T本来大小32 x 3 x n x p的。您还可以将轴设置为负值,如-1,这意味着最后一个维度,即在这种情况下为3。

关于偏移量参数,我检出了$ CAFFE_ROOT/src/caffe/proto/caffe.proto(在630行),我没有找到任何偏移量参数的默认值,所以我假设你必须提供该参数否则会导致错误。但是,我可能是错的。

现在,Caffe知道你需要第一个轴上的大小为m的斑点。我们仍然需要告诉Caffe从哪里收获。这是抵消来的地方。如果抵消是10,那么您的斑点大小m将从10开始裁剪,并在10+m-1(总大小为m)结束。在所有维度(由axis确定,请记住?在这种情况下为1, 2, 3)中设置一个偏移量值以裁剪该量。否则,如果要以不同方式裁剪每个尺寸,则必须指定等于正被裁剪的尺寸数量(在此情况下为3)的偏移量数量。所以总结了所有,

如果你有大小32 x 3 x 224 x 224的BLOB和您要裁剪尺寸32 x 3 x 32 x 64的中心部分,那么你会写出如下作物层:

layer { 
    name: "T" 
    type: "Crop" 
    bottom: "A" 
    bottom: "B" 
    top: "T" 
    crop_param { 
     axis: 2 
     offset: 96 
     offset: 80 
    } 
} 
+0

感谢您的回答。似乎裁剪是在https://github.com/BVLC/caffe/blob/master/python/caffe/coord_map.py中实现的。由于我对Python不太熟悉,因此我并不了解所有内容。但似乎默认参数在那里。在我的理解中,完全卷积CNN需要一个固定大小的输入。如果输入尺寸不同,则处理裁剪参数时会出现问题。我对么? – user570593

+1

@ user570593我不确定FCNN是如何工作的。但是,作物层需要两个底部斑点。如果其中一个大小不一,另一个大小(上面例子中的参考blob,“B”)的大小是固定的,那么不同大小的blob将被剪裁成与“B”大小一样。这应该不会造成问题。当然,你在裁剪时会丢失一些信息。所以FCNN必须有一些处理方式。我认为当他们编写'params.get('offset',0)'(在[line 46](github.com/BVLC/caffe/blob/master/python/caffe/coord_map.py))时,我认为他们分配默认值= 0来抵消。 –

+0

我相信默认值确实是'0',即从一开始的角落。但是正确的参考可能是[here](https://github.com/BVLC/caffe/blob/master/src/caffe/layers/crop_layer.cpp#L50),它将该值初始化为0。 – wlnirvana