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.reshape
和 numpy.transpose
完成所有这些,但那不是高效,是吗?
transpose
和 reshape
是两个 根本上 不同的操作:
虽然 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 实现。
Caffe
实现了 reshape
层,但假设我想先将 (1, n, k, p)
的 blob 重塑为 (1, a, b, k, p)
,其中 n= a*b
然后转置它塑造 (1, b, a, k, p)
,如何实现这个操作,我知道我可以写一个单独的 python 层并用 numpy.reshape
和 numpy.transpose
完成所有这些,但那不是高效,是吗?
transpose
和 reshape
是两个 根本上 不同的操作:
虽然 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
要获取
[[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 实现。