K.W*_*ter 1 machine-learning computer-vision neural-network deep-learning caffe
Caffe有reshape层实现,但说我想先重塑的一个blob (1, n, k, p)来(1, a, b, k, p),在那里n= a*b,然后调换它塑造(1, b, a, k, p),如何实现这种操作,我知道我可以写一个单独的蟒蛇层,做这一切与numpy.reshape和numpy.transpose,但是这将是不高效,是吗?
transpose和reshape是两个根本不同的操作:
虽然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实现.