【问题标题】:Can caffe reshape layer do transposecaffe reshape layer可以转置吗
【发布时间】:2018-07-01 22:45:50
【问题描述】:

Caffe 实现了reshape 层,但是说我想先将(1, n, k, p) 的blob 重塑为(1, a, b, k, p),其中n= a*b 再转置为shape (1, b, a, k, p),如何实现此操作,我知道我可以编写一个单独的 python 层并使用numpy.reshapenumpy.transpose 来完成所有这些工作,但这效率不高,是吗?

【问题讨论】:

    标签: machine-learning neural-network computer-vision deep-learning caffe


    【解决方案1】:

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

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

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

    在内存中,这些值以一维连续方式(行优先)存储:

    [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)有一个"Permute" 层,相当于transpose

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2018-07-08
      • 2019-06-10
      • 1970-01-01
      • 2018-06-10
      • 2017-03-20
      相关资源
      最近更新 更多