如何在 Caffe中重塑形状N x C x H x W
的斑点?N x 1 x (C*H) x W
我想制作一个卷积层,其权重在通道之间是相同的。
我想出的一种方法是将形状的底部斑点重塑N x C x H x W
为N x 1 x (C*H) x W
并在其上放置一个卷积层。但我只是不知道如何重塑一个斑点。
请帮帮我,谢谢。
如何在 Caffe中重塑形状N x C x H x W
的斑点?N x 1 x (C*H) x W
我想制作一个卷积层,其权重在通道之间是相同的。
我想出的一种方法是将形状的底部斑点重塑N x C x H x W
为N x 1 x (C*H) x W
并在其上放置一个卷积层。但我只是不知道如何重塑一个斑点。
请帮帮我,谢谢。
正如whjxnyzh所指出的,您可以使用"Reshape"
layer. Caffe 在允许您定义输出形状的方式上非常灵活。
参见caffe.proto` 中的声明reshap_param
:
// Specify the output dimensions. If some of the dimensions are set to 0, // the corresponding dimension from the bottom layer is used (unchanged). // Exactly one dimension may be set to -1, in which case its value is // inferred from the count of the bottom blob and the remaining dimensions.
在你的情况下,我猜你会有一个像这样的层:
layer {
name: "my_reshape"
type: "Reshape"
bottom: "in"
top: "reshaped_in"
reshape_param { shape: {dim: 0 dim: 1 dim: -1 dim: 0 } }
}
另请参阅caffe.help。
Caffe 现在为您提供了一个 reshapeLayer。 http://caffe.berkeleyvision.org/doxygen/classcaffe_1_1ReshapeLayer.html
如果我理解您的最终目标,Caffe 的卷积层已经可以使用通用/共享过滤器进行多个输入输出卷积,例如:
layer {
name: "conv"
type: "Convolution"
bottom: "in1"
bottom: "in2"
bottom: "in3"
top: "out1"
top: "out2"
top: "out3"
convolution_param {
num_output : 10 #the same 10 filters for all 3 inputs
kernel_size: 3
}
}
假设您已拆分所有流(切片层可以做到这一点),最后您可以根据需要将它们与 concat 或 eltwise 层合并。
这避免了对 blob 进行重新整形、卷积然后重新整形的需要,这可能会在边缘附近引入跨通道干扰。
不确定这是否完全符合您的规格,但 Caffe 确实有扁平层。blob 从 n * c * h * w 变为 n * (c h w) * 1 * 1。