caffe reshape层可以进行转置

K.W*_*ter 1 machine-learning computer-vision neural-network deep-learning caffe

Caffereshape层实现,但说我想先重塑的一个blob (1, n, k, p)(1, a, b, k, p),在那里n= a*b,然后调换它塑造(1, b, a, k, p),如何实现这种操作,我知道我可以写一个单独的蟒蛇层,做这一切与numpy.reshapenumpy.transpose,但是这将是不高效,是吗?

Sha*_*hai 6

transposereshape是两个根本不同的操作:
虽然reshape仅改变斑点的形状,它不会影响它的内部结构(并且因此可以非常有效地执行).另一方面,transpose重新安排blob的数据.

我们来看一个简单的例子.
假设你有一个带有值的2x2 blob

[[0, 1], [2, 3]]
Run Code Online (Sandbox Code Playgroud)

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

[0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

如果你reshape的blob为4x1

[[0], [1], [2], [3]]
Run Code Online (Sandbox Code Playgroud)

内存中元素的基本排列不会改变.
但是,如果你transpose获得blob

[[0, 2], [1, 3]]
Run Code Online (Sandbox Code Playgroud)

基本安排也改为

[0, 2, 1, 3]
Run Code Online (Sandbox Code Playgroud)

因此,您不能"Reshape"图层用于transposeblob.

Caffe SSD分支(由Weilu提供)有"Permute"一层相当于transpose.

关于性能的注意事项:
虽然reshape只更改blob的标题(O(1)运行时和空间),但transpose需要重新排列内存中的元素,从而占用O(n)时间和空间.
更糟糕的是,如果您使用它numpy.transpose来执行任务,则意味着您transpose在CPU(主机内存)中,从而在CPU和GPU内存之间添加两个同步操作(同步GPU-> CPU,在CPU中转置,同步CPU-> GPU).
所以,如果你没有办法,只好transpose(又名"Permute")确保你有一个GPU实现.