【我的TensorFlow之路·4】关于CNN的一些细节问题
分类:
文章
•
2022-11-29 17:12:27
本系列日记GitHub:
欢迎follow和star。
看CNN相关的东西也有一段时间了,但总是感觉深入不进去,这次又读《面向机器智能的TensorFlow实践》这本书,补充了一些知识漏洞,以前不太注意的,或者直接拿来用的一些东西,现在有了更深入的了解。
1.步长
设置步长是一种调整输入张量维度的方法。降维可减少所需的运算量,并可避免创建一些完全重叠的感受域。strides参数用来控制步长,其格式与输入向量相同,即(image_batch_size_stride,
image_height_stride,
image_width_stride,
image_channels_stride)
其中第一个和最后一个参数通常很少修改,主要控制特征图宽和高这两维度的步长。
官方解释:
2.边界填充
由padding参数控制的边界填充有两个可选值,分别是SAME和VALID,之前只知道SAME是全零填充,一直都是直接使用SAME,没有去深究和VALID的区别。书中关于这两个可选值的解释为:
3.深入理解卷积核
在摄影中,滤波器可以对图片进行大幅度修改,例如红色滤波器可以控制只有红光透过(其他色光会被吸收)。而在CV中,滤波器可以突出自己感兴趣的特征,弱化自己不感兴趣的特征,以下是两个例子:
①
②
以上两个为不同的卷积核输出的特征,,可以明显看出,第一个卷积核对边缘更感兴趣,其实这就是一个专门针对边缘检测的卷积核;而第二个卷积核的作用是增加卷积核中心位置的灰度,降低卷积核边缘位置的灰度,其实这是一个用于“锐化”的卷积核。
4.单层CNN
CNN在面对复杂问题时,单层是远远不够的,但是单层CNN也有它的用途,如边缘检测。在面对绝大多数任务时,还是需要和其他层混合使用。
5.卷积层
TensorFlow实现的卷积并非真正的卷积运算(所以先在到底是什么,我也还不知道),它采用的是一种可以针对不同类型的卷积进行加速的技术。tf.nn.conv2d是最常用的一种卷积,另外还有一些其他类型的卷积:
6.**层
与其它层混合使用生成特征图,主要对结果进行平滑(微分),目标是为神经网络引入非线性。性能较为突出的**函数为tf.nn.relu(),另外还有tf.nn.sigmoid()、tf.nn.tanh()、tf.nn.dropout()。
7.池化层
池化层可以较高效地降维,从而减少过拟合。常用池化方式为最大池化、平均池化,即tf.nn.max_pool()、tf.nn.avg_pool()。
8.加载图像的细节
9.图像格式
TensorFlow中主要包含两种图像格式,分别是tf.image.decode_jpeg和tf.image.decode_png。值得注意的是,JPEG格式不会存储alpha通道信息,即透明度,但png可以存储。png采用无损压缩,存储的是原始文件,但其文件体积要比JPEG大。
TensorFlow有一种内置的文件格式——TFRecord,它可以将二进制数据和标签数据存在同一个文件内,在模型训练前可以通过预处理将数据存为TFRecord格式,存储的标签格式为OneHotEncode。以下是一个使用该格式文件的例子: