在caffe中,convolution
图层取一个底部斑点,并使用学习滤波器(使用权重类型 - “Xavier”,“MSRA”等初始化)卷积它。但是,我的问题是,我们是否可以简单地将两个底层斑点进行卷积并产生顶层斑点。这样做最优雅的方式是什么?这样做的目的是:底部blob之一将是data
,另一个将是由以前的图层(我试图实现dynamic convolution)生成的动态筛选器(取决于data
)。如何在caffe中卷积两个斑点
我尝试:
的一种方法,其来到了我的脑海里是修改filler.hpp
并分配一个底部BLOB作为filler
矩阵本身(而不是“泽维尔”,“MSRA”等)。然后我认为卷积层会从那里接收。我们可以设置lr = 0
来表明我们的自定义填充程序初始化的权重不应该改变。但是,在查看源代码之后,我仍然不知道该怎么做。另一方面,我不想打破caffe的工作流程。如果我希望它们能够正常工作,我仍然希望conv图层正常工作。
很显然,一个更繁琐的方法是使用Slice
,tile
和/或Scale
层的组合来字面地实现卷积。我认为它会起作用,但它会变得混乱。任何其他想法?
编辑1:
我通过修改CAFFE的卷积层写一个新层。特别是,在src/caffe/layers/conv_layer.cpp
的第27行中,它采用由filler
定义的权重,并将其与底部斑点进行卷积。因此,我不是从filler
填充那个blob,而是修改了这个图层,使它现在需要两个底部。底部的一个直接被分配给填充物。现在,我不得不做一些其他更改,如:
weight
blob具有相同的值为所有样品。这里对不同的样品会有不同的值。因此,我改变行32:
this->forward_cpu_gemm(
bottom_data + n * this->bottom_dim_,
weight,
top_data + n * this->top_dim_);
到:
this->forward_cpu_gemm(
bottom_data + n * bottom[1]->count(1),
bottom[0]->cpu_data() + n * bottom[0]->count(1),
top_data + n * this->top_dim_);
为了方便起见,我认为不涉及偏差项,步幅始终为1,填充可以始终为0 ,group总是1等。然而,当我测试正向传递时,它给了我一些奇怪的答案(简单的卷积核= np.ones((1,1,3,3))
。这个内核的学习速率被设置为0,所以它不会改变。但是,我不能得到正确的答案。任何建议将不胜感激。
请不要提出使用现有层的解决方案,例如Slice, Eltwise, Crop
。我已经实施 - 它的工作 - 但它是令人难以置信的复杂和内存效率低下。
我读过“如何说服咖啡里的两个金发女郎”:\ – Elazar
@Elazar所以这就是为什么你倒票? (只是开个玩笑):P –