caffe reshape层可以转置吗

Can caffe reshape layer do transpose

Caffe 实现了 reshape 层,但假设我想先将 (1, n, k, p) 的 blob 重塑为 (1, a, b, k, p),其中 n= a*b 然后转置它塑造 (1, b, a, k, p),如何实现这个操作,我知道我可以写一个单独的 python 层并用 numpy.reshapenumpy.transpose 完成所有这些,但那不是高效,是吗?

transposereshape 是两个 根本上 不同的操作:
虽然 reshape 只会改变 blob 的形状,但不会影响其内部结构(因此可以非常有效地执行)。另一方面,transpose re-arrange blob 的数据。

让我们看一个简单的例子。
假设你有一个 2x2 的 blob,其值为

[[0, 1], [2, 3]]

在内存中,值以一维连续方式存储 (row-major):

[0, 1, 2, 3]

如果你 reshape 将 blob 设置为 4x1

[[0], [1], [2], [3]]

元素在内存中的基本排列没有改变。
但是,如果您 transpose 要获取

的 blob
[[0, 2], [1, 3]]

基础安排也改为

[0, 2, 1, 3]

因此,您不能使用"Reshape"层来transpose一个blob。

Caffe SSD分支(按Weilu) has a "Permute"层相当于transpose.

关于性能的说明:
虽然 reshape 仅更改 blob 的 header(O(1) 运行时和 space),但 transpose 需要 re-arrange 内存中的元素,因此需要 O(n) 时间和 space.
更糟糕的是,如果你使用 numpy.transpose 来执行任务,这意味着你 transpose in CPU (主机内存)因此添加了两个同步操作在 CPU 和 GPU 内存之间(同步 GPU->CPU,在 CPU 中转置,同步 CPU->GPU)。
因此,如果您别无选择,只能 transpose(又名 "Permute"),请确保您有 GPU 实现。