【我的TensorFlow之路·4】关于CNN的一些细节问题

本系列日记GitHub:

https://github.com/zhengyuv/MyTFRoad

欢迎follow和star。

       看CNN相关的东西也有一段时间了,但总是感觉深入不进去,这次又读《面向机器智能的TensorFlow实践》这本书,补充了一些知识漏洞,以前不太注意的,或者直接拿来用的一些东西,现在有了更深入的了解。

1.步长

       设置步长是一种调整输入张量维度的方法。降维可减少所需的运算量,并可避免创建一些完全重叠的感受域。strides参数用来控制步长,其格式与输入向量相同,即(image_batch_size_stride,

image_height_stride,

image_width_stride,

image_channels_stride)

其中第一个和最后一个参数通常很少修改,主要控制特征图宽和高这两维度的步长。

官方解释:【我的TensorFlow之路·4】关于CNN的一些细节问题

2.边界填充

       由padding参数控制的边界填充有两个可选值,分别是SAME和VALID,之前只知道SAME是全零填充,一直都是直接使用SAME,没有去深究和VALID的区别。书中关于这两个可选值的解释为:

【我的TensorFlow之路·4】关于CNN的一些细节问题

       看了这些解释还是云里雾里的,于是找了篇比较直观的带图片的解释:https://blog.csdn.net/wuzqchom/article/details/74785643。这样就一目了然了,在卷积核的感受野到达边缘时,如果输入特征图剩余的区域不如感受野大,使用SAME会把特征图缺少的部分用零填充,而VALID则会舍弃那些特征。这也就如书中所说VALID需要考虑滤波器的尺寸。另外,更详细的内部代码可以参考:https://www.tensorflow.org/api_guides/python/nn#Notes_on_SAME_Convolution_Padding

3.深入理解卷积核

       在摄影中,滤波器可以对图片进行大幅度修改,例如红色滤波器可以控制只有红光透过(其他色光会被吸收)。而在CV中,滤波器可以突出自己感兴趣的特征,弱化自己不感兴趣的特征,以下是两个例子:

【我的TensorFlow之路·4】关于CNN的一些细节问题

【我的TensorFlow之路·4】关于CNN的一些细节问题

       以上两个为不同的卷积核输出的特征,,可以明显看出,第一个卷积核对边缘更感兴趣,其实这就是一个专门针对边缘检测的卷积核;而第二个卷积核的作用是增加卷积核中心位置的灰度,降低卷积核边缘位置的灰度,其实这是一个用于“锐化”的卷积核。

4.单层CNN

       CNN在面对复杂问题时,单层是远远不够的,但是单层CNN也有它的用途,如边缘检测。在面对绝大多数任务时,还是需要和其他层混合使用。

5.卷积层

        TensorFlow实现的卷积并非真正的卷积运算(所以先在到底是什么,我也还不知道),它采用的是一种可以针对不同类型的卷积进行加速的技术。tf.nn.conv2d是最常用的一种卷积,另外还有一些其他类型的卷积:

①tf.nn.depthwise_conv2d:当需要讲一个卷积层的输出连到另一个卷积层的输入时,可使用这种卷积。参考:https://tensorflow.google.cn/api_docs/python/tf/nn/depthwise_conv2dhttps://blog.csdn.net/mao_xiao_feng/article/details/78003476

②tf.nn.seperable_conv2d:对于规模较大的模型,它可在不牺牲准确率的前提下实现训练的加速,对于规模较小的模型,它能够快速收敛,但准确率较低。参考:https://tensorflow.google.cn/api_docs/python/tf/contrib/layers/separable_conv2dhttps://blog.csdn.net/mao_xiao_feng/article/details/78002811

③tf.nn.conv2d_transpose:参考:https://tensorflow.google.cn/api_docs/python/tf/nn/conv2d_transposehttps://blog.csdn.net/mao_xiao_feng/article/details/71713358

6.**层

       与其它层混合使用生成特征图,主要对结果进行平滑(微分),目标是为神经网络引入非线性。性能较为突出的**函数为tf.nn.relu(),另外还有tf.nn.sigmoid()、tf.nn.tanh()、tf.nn.dropout()。

7.池化层

       池化层可以较高效地降维,从而减少过拟合。常用池化方式为最大池化、平均池化,即tf.nn.max_pool()、tf.nn.avg_pool()。

8.加载图像的细节

【我的TensorFlow之路·4】关于CNN的一些细节问题

9.图像格式

        TensorFlow中主要包含两种图像格式,分别是tf.image.decode_jpeg和tf.image.decode_png。值得注意的是,JPEG格式不会存储alpha通道信息,即透明度,但png可以存储。png采用无损压缩,存储的是原始文件,但其文件体积要比JPEG大。

       TensorFlow有一种内置的文件格式——TFRecord,它可以将二进制数据和标签数据存在同一个文件内,在模型训练前可以通过预处理将数据存为TFRecord格式,存储的标签格式为OneHotEncode。以下是一个使用该格式文件的例子:

【我的TensorFlow之路·4】关于CNN的一些细节问题

【我的TensorFlow之路·4】关于CNN的一些细节问题

【我的TensorFlow之路·4】关于CNN的一些细节问题

【我的TensorFlow之路·4】关于CNN的一些细节问题

【我的TensorFlow之路·4】关于CNN的一些细节问题