【问题标题】:Why does TensorFlow calculate 2D convolutions when 1D convolution is called?为什么TensorFlow在调用1D卷积时要计算2D卷积?
【发布时间】:2019-12-30 13:42:28
【问题描述】:

在 tf.nn.conv1d 的文档中,是这样写的

在内部,此操作会重塑输入张量并调用 tf.nn.conv2d。例如,如果data_format不以“NC”开头,则将一个形状为[batch, in_width, in_channels]的张量reshape为[batch, 1, in_width, in_channels],并且filter被reshape为[1, filter_width, in_channels, out_channels]。然后将结果重新整形为 [batch, out_width, out_channels](其中 out_width 是步幅和填充的函数,如 conv2d 中一样)并返回给调用者。

我知道这些操作是等效的,但我对这个实现细节的含义有点困惑。

重塑是否会产生一些计算开销? 3D卷积有自己的实现,为什么1D卷积没有呢?

感谢任何帮助我和其他人理解 TensorFlow 实现细节的解释!

【问题讨论】:

    标签: tensorflow conv-neural-network convolution


    【解决方案1】:

    通过挖掘源代码,我得出结论,这样做可能是为了方便和实现的极简主义 - 详情如下。

    首先,没有“重塑”,只有扩展、挤压和重新排序 dims,这会产生很小的开销;实际上没有数组元素在内存中移动 - 只有张量对象的索引说明符被更改。

    其次,所有conv 最终路由到tf.nn_ops.convolution_internal,然后路由到gen_nn_ops.conv2dgen_nn_ops.conv3dconv1dgen_nn_ops.py 中不存在。请注意,由于某种原因,您不会在 Git 存储库中找到该文件 - 但它应该在您的本地安装中,/python/ops/gen_nn_ops.py

    最后,要真正回答为什么没有专门的conv1d 实现,您需要询问gen_nn_ops.py 中卷积算法背后的 cuDNN 开发人员;他们可能没有发现性能改进,而conv2d 的工作速度也一样快。从低级别的角度来看,这是有道理的,因为在M x 1 输入上使用N x 1 元素滑动内核时的矩阵乘法数量与N 沿M 的矩阵乘法数量相同——同样,唯一的区别正在索引中。

    不幸的是,开发人员决定封装最终调用,即_pywrap_tensorflow_internal.TFE_Py_FastPathExecute;该模块由.lib.pyd 文件组成——基本上,编译后的C(Cython)代码需要反汇编才能进行自省。


    TL;DR (1) “重塑”的开销很小; (2) 每个备用冗余可能缺少专用的conv1d 实现,因为conv2d 的速度一样快; (3) 我不是 cuDNN 专家,所以如果你需要确定,最好在cuDNN 询问,或者阅读他们的SDK Documentation。或者,TF Github 的开发人员可能会有所帮助。我已经好几年没有看到 cuDNN 开发者回答 SO,所以在这里发帖可能不是最好的选择。


    Dim 重新排序性能演示

    import numpy as np
    from time import time
    
    x = np.random.randn(700, 800, 900) # 504,000,000 elements
    
    t0 = time()
    for i in range(1000):
        if i % 2 == 0:
            x = x.reshape(700, 900, 800)
        else:
            x = x.reshape(700, 800, 900)
    print(time() - t0)
    
    0.0009968280792236328
    

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      相关资源
      最近更新 更多