TensorFlow 1.5.0 已经 release,笔者在将 1.4 代码移植到 1.5 时,发现了一些 API 变化,经查阅官网文档,写了简单测试代码,记录于本文,有兴趣的童鞋可以深入研究下。
TensorFlow 1.5.0 相比 1.4.x 大的变化不多,主要是增加了对 CUDA 9、cuDNN 7 的支持,本公众号之前的文章《Nvidia Jetson TX2 上编译安装 TensorFlow r1.5》已经介绍过搭建环境的方法,本文使用的环境保持不变。
使用 3x3 卷积核 ,输入特征图 5x5,无 dilations,无 strides,padding = 'VALID',数据格式采用默认的 'NHWC'(两种不同格式区别参考《TensorFlow API 中 NCHW 与 NHWC 的区别》)。测试代码如下:
运行结果:(1, 3, 3, 16),即输出特征图空间尺寸为 3x3,通道数目为 16。
padding 模式为 'VALID' 时,卷积核在输入特征图上滑动时,只覆盖有效像素,不会超出特征图边界,如图所示(黄色为输入特征图,蓝色为卷积核):
对应输出特征图位置 (0, 0)
对应输出特征图位置 (0, 1)
对应输出特征图位置 (0, 2)
………………
对应输出特征图位置 (2, 2)
查阅官网 API 手册【2】,可以看到 dilations 参数说明如下:
: An optional list of . Defaults to . 1-D tensor of length 4. The dilation factor for each dimension of . If set to k > 1, there will be k-1 skipped cells between each filter element on that dimension. The dimension order is determined by the value of , see above for details. Dilations in the batch and depth dimensions must be 1.
为了测试扩展卷积,将前面代码改为:
运行结果:(1, 1, 1, 16),即输出空间尺寸为 1x1,通道数为 16。使用 dilations = [1, 2, 2, 1] 意义是将原先 3x3 卷积核在特征图上先做“扩展”,相邻两个权值间距为 2 个像素(或说间隔 2-1 = 1 个像素),再进行滑动,由于 padding 模式仍为 'VALID',扩展后的卷积核仍然不能超出输入特征图的边界。具体如下图所示:
经过扩展的卷积核,可以覆盖 5x5 输入特征图的范围,即“感受野”(Receptive Field)为 5x5。
虽然我们也可以使用 5x5 卷积核实现相同的感受野,但扩展卷积显然更节省计算量和模型尺寸,在嵌入式设备上部署时可以降低处理延迟和设备功耗。
参考资料
【1】 TensorFlow 1.5.0 Release Notes:https://github.com/tensorflow/tensorflow/releases
【2】 https://www.tensorflow.org/api_docs/python/tf/nn/conv2d
领取专属 10元无门槛券
私享最新 技术干货