在tf.nn.conv1d的文档中指出
在内部,此op重塑输入张量并调用tf.nn.conv2d。例如,如果data_format并非以“ NC”开头,则将形状为[batch,in_width,in_channels]的张量整形为[batch,1,in_width,in_channels],并将过滤器整形为[1,filter_width,in_channels, out_channels]。然后将结果重新整形为[batch,out_width,out_channels](其中out_width是conv2d中跨度和填充的函数),并返回给调用方。
我知道这些操作是等效的,但是我对实现细节的含义有些困惑。
重塑会产生一些计算开销吗? 3D卷积具有自己的实现,那么为什么不使用1D卷积呢?
感谢您提供任何有助于我理解TensorFlow实施细节的解释!
答案 0 :(得分:0)
仔细研究一下源代码,我得出结论,这样做可能是为了方便和简化实现-下面详细介绍。
首先,没有“重塑”,只有扩展,压缩和重新排序暗淡,这只是很小的开销。内存中实际上没有移动任何数组元素-仅更改了张量对象的索引说明符。
第二,所有img.clipsToBounds = true
最终都路由到tf.nn_ops.convolution_internal
,然后路由到conv
或gen_nn_ops.conv2d
; gen_nn_ops.conv3d
中不存在conv1d
。请注意,由于某些原因,您不会在Git存储库中找到该文件-但该文件应该在您的本地安装gen_nn_ops.py
中。
最后,要想真正了解为什么没有专用的/python/ops/gen_nn_ops.py
实现,您需要询问conv1d
中发现的卷积算法背后的cuDNN开发人员;他们可能没有发现性能上的改进,并且gen_nn_ops.py
的运行速度也一样快。从低层次的角度来看,这是有道理的,因为沿着conv2d
输入滑动带有N x 1
个元素的内核时矩阵乘法的次数与沿着{{1 }}-同样,唯一的区别在于索引编制。
不幸的是,开发人员决定封装最终调用,即M x 1
;该模块包含一个N
和一个M
文件-基本上是经过编译的C(Cython)代码,需要反汇编才能进行内省。
TL; DR(1)“重塑”的开销很小。 (2)由于_pywrap_tensorflow_internal.TFE_Py_FastPathExecute
一样快,因此每个备用冗余都可能缺少专用的.lib
实现; (3)我不是cuDNN专家,所以如果您需要确定,最好在cuDNN进行询问,或阅读他们的SDK Documentation。另外,TF Github的开发人员可能会有所帮助。我已经多年没有看到cuDNN开发人员对SO的回答了,所以在这里发布可能不是最好的选择。
Dim重新排序性能演示:
.pyd
conv1d