- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在咖啡中,convolution
层采用一个底部blob,并将其与学习过滤器(使用权重类型初始化 - “Xavier”、“MSRA”等)进行卷积。但是,我的问题是我们是否可以简单地卷积两个底部 Blob 并产生顶部 Blob 。这样做最优雅的方式是什么?这样做的目的是:底部 blob 之一将是 data
另一个将是由先前层产生的动态过滤器(根据 data
变化)(我正在尝试实现 dynamic convolution )。
我的尝试:
我想到的一种方法是修改 filler.hpp
并将底部 blob 分配为 filler
矩阵本身(而不是“Xavier”、“MSRA”等)。然后我认为卷积层会从那里开始。我们可以设置lr = 0
表示不应更改由我们的自定义填充器初始化的权重。但是,看了源码之后,还是不知道怎么弄。另一方面,我不想破坏 caffe 的工作流程。如果我想要的话,我仍然希望卷积层能够正常运行。
显然更繁琐的方法是使用 Slice
的组合。 , tile
和/或 Scale
层从字面上实现卷积。我认为它会起作用,但结果会很困惑。还有其他想法吗?
编辑 1:
我通过修改caffe的卷积层写了一个新层。特别是在 src/caffe/layers/conv_layer.cpp
,在第 27 行,它采用 filler
定义的权重并将其与底部 blob 进行卷积。因此,不要从 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_);
np.ones((1,1,3,3))
。这个内核的学习率设置为零,因此它不会改变。但是,我无法得到正确的答案。任何建议将不胜感激。
Slice, Eltwise, Crop
.我已经实现了——它有效——但它非常复杂且内存效率低下。
最佳答案
我认为您总体上走在正确的道路上。
对于“奇怪”的卷积结果,我猜这个错误最有可能是:
考虑二维卷积
并假设 bottom[1]
的形状是 (num, channels, height, width)
,
由于 caffe
中的卷积执行为 2 矩阵的乘法,weight
(代表卷积核)和col_buffer
(从要卷积的数据重组)和weight
属于 num_out
行和 channels / this->group_ * kernel_h * kernel_w
列,col_buffer
属于 channels / this->group_ * kernel_h * kernel_w
行和 height_out * width_out
列,如 weight
动态卷积层的blob,bottom[0]
的形状最好是 (num, num_out, channels/group, kernel_h, kernel_w)
为了满足
bottom[0]->count(1) == num_out * channels / this->group_ * kernel_h * kernel_w
num_out
是动态卷积层输出特征图的数量。
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_);
bottom[0]->shape(0) == bottom[1]->shape(0) == num
bottom[0]->count(1) == num_out * channels / this->group_ * kernel_h * kernel_w
np.ones((1,1,3,3))
您使用的可能不满足上述条件并导致错误的卷积结果 .
include/caffe/layers/dyn_conv_layer.hpp,base_conv_layer.hpp
src/caffe/layers/dyn_conv_layer.cpp(cu)
caffe
中的卷积层增长几乎相同,区别主要有:
LayerSetUp()
初始化 this->kernel_dim_
, this->weight_offset_
等适用于卷积并忽略初始化this->blobs_
卷积层通常用于包含权重和偏差; Reshape()
检查 bottom[1]
作为内核容器具有适当的卷积形状。 src/caffe/test/test_dyn_convolution_layer.cpp
.它似乎工作正常,但可能需要更彻底的测试。
cd $CAFFE_ROOT/build && ccmake ..
建立这个 caffe ,
cmake -DBUILD_only_tests="dyn_convolution_layer" ..
和
make runtest
检查它。
关于deep-learning - 如何在caffe中卷积两个blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38680318/
我是一名优秀的程序员,十分优秀!