如何在Caffe中合并多个不同形状的blob?

时间:2016-12-17 20:20:57

标签: caffe

我正在尝试将几个底部blob合并到一个顶部blob中,然后将其提供给下一层 这些斑点来自不同的卷积/ FC层,因此它们的形状不同 我尝试了concat图层,但使用0或1轴,我得到错误,如:

I1217 23:47:56.877848  9968 layer_factory.cpp:58] Creating layer concat_fuse2
I1217 23:47:56.878350  9968 net.cpp:100] Creating Layer concat_fuse2
I1217 23:47:56.878350  9968 net.cpp:434] concat_fuse2 <- relu4_relu4_0_split_1
I1217 23:47:56.878850  9968 net.cpp:434] concat_fuse2 <- relu5_relu5_0_split_1
I1217 23:47:56.879349  9968 net.cpp:434] concat_fuse2 <- relu6_relu6_0_split_0
I1217 23:47:56.879349  9968 net.cpp:408] concat_fuse2 -> fuse_4_6
F1217 23:47:56.879849  9968 concat_layer.cpp:42] Check failed: top_shape[j] == bottom[i]->shape(j) (32 vs. 16) All inputs must have the same shape, except at concat_axis.
*** Check failure stack trace: ***

我应该怎么做?

1 个答案:

答案 0 :(得分:4)

Caffe在错误消息中告诉您失败的原因:

  

除concat_axis外,所有输入必须具有相同的形状。

原因是,所有数据都存储在Blobs中,这些数据是 N - 维数组。图像数据的典型Blob有四个维度:数字 N x通道 K x高度 H x宽度 W 。在Blob中,通道的宽度,高度和数量必须相同。这意味着,一批中的所有图像必须具有相同数量的通道,宽度和高度。

Concat用于沿轴0(图像数)或轴1(通道)连接。这意味着,您只能连接具有相同高度和宽度的输入。

现在,我假设您在连接图层之后仅使用FC图层,因为我不认为您可以通过这种连接很好地保留空间信息。这意味着,如果输入是 H x W 图像或 1 x HW 向量,它对网络没有影响。

因此,您可以使用Reshape图层来堆叠 K 维度中的所有信息,即频道数量。因此,我们从尺寸 N x K x H x W 到尺寸 N x KHW x 1 x 1 。在所有输入Blob上完成此操作后,您可以轻松地沿轴1使用Concat