代码之家  ›  专栏  ›  技术社区  ›  K.Wanter

caffe可以重塑层进行转置吗

  •  1
  • K.Wanter  · 技术社区  · 7 年前

    Caffe reshape 层实现,但假设我想首先重塑 (1, n, k, p) (1, a, b, k, p) 哪里 n= a*b 然后将其转换为形状 (1, b, a, k, p) ,如何实现此操作,我知道我可以编写一个单独的python层并使用 numpy.reshape numpy.transpose ,但这样做效率不高,是吗?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Shai    7 年前

    transpose reshape 是两个 从根本上讲 不同的操作:
    虽然 重塑形状 仅更改blob的形状,不会影响其内部结构(因此可以非常有效地执行)。另一方面 转置 重新排列blob的数据。

    让我们看一个简单的例子。
    假设您有一个2x2 blob,其中包含值

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

    在内存中,值以1D连续方式存储(行主):

    [0, 1, 2, 3]
    

    如果你 重塑形状 blob到4x1

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

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

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

    基础安排也更改为

    [0, 2, 1, 3]
    

    因此,您 不能 使用 "Reshape" 图层到 转置 一团。

    Caffe SSD分支机构 Weilu )有一个 "Permute" 相当于 转置 .

    关于性能的说明:
    虽然 重塑形状 仅更改blob的标题( O(1) 运行时间和空间), 转置 需要重新排列内存中的元素,从而 O(n) 时间和空间。
    如果你使用 numpy.transpose 执行任务意味着你 转置 在CPU(主机内存)中,因此在CPU和GPU内存之间添加了两个同步操作(同步GPU->CPU、转置CPU、同步CPU->GPU)。
    所以,如果你别无选择 转置 (又名 “置换” )确保您有GPU实现。