tensorflow && caffe conv2D GPU版

tensorflow && caffe conv2D GPU版_第1张图片
clipboard.png

图片来自论文: https://hal.archives-ouvertes.fr/file/index/docid/112631/filename/p1038112283956.pdf

tensorflow && caffe conv2D GPU版_第2张图片

caffe 跟 tensorflow对二维卷积的实现都是基于im2col的思路,上两图为caffe的实现,输入格式采用的是NWHC,tensorflow的原理基本相同,但在最后的实现中,采用的都是NCWH格式,所以在gen_nn_ops中矩阵的维度跟上图有一些不同,即把卷积操作转化为矩阵的乘法运算,而矩阵的乘法运算在【cuda C 编程手册】中介绍的很清晰了,用tiled算法很容易可以完成加速,运算速度非常快。
tensorflow的源码脉络:

tf.contrib.slim.conv2d
----tf.contrib.layers.conv2d
--------tf.layers.conv2d()
------------tf.nn.conv2d()
----------------tf.nn_ops.conv2d(...) 
--------------------tf.gen_nn_ops.conv2d(...) (文件编译自动生成,害我在github上找了半天)
--------------------_op_def_lib.apply_op("Conv2D", ...) 

最后的实现用C++在文件conv_ops.cc中(尼玛,套这么多层有毛意思):
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/conv_ops.cc
tensorflow的python接口中,大部分常用的深度神经网络算子都是在tf.nn中实现的,也是python接口中最底层的,一些其他的应用在上边做了一些其他的封装,比如 models中的slim,keras等,来看下tf.gen_nn_ops.conv2d(...)具体是怎么实现的卷积操作:

tensorflow && caffe conv2D GPU版_第3张图片

除了给出卷积层的实现,还有卷基层的梯度计算实现:


tensorflow && caffe conv2D GPU版_第4张图片

最后用的cudnn函数库实现。

到了矩阵乘法,剩下的用cuda来做就比较容易实现了【cuda C 编程手册】或者上篇【cuda 矩阵乘法运算并行】。

你可能感兴趣的:(tensorflow && caffe conv2D GPU版)