tensorflow2.0——神经网络的层(层全连接层、卷积层、池化层、BN层、激活层、dropout层及其他层)
一、全连接层
tensorflow中用tf.keras.layers.Dense()这个类作为全连接的隐藏层,下面是参数介绍:
tf.keras.layers.Dense()
- inputs = 64, # 输入该网络层的数据
- units = 10, # 输出的维度大小
- activation = None, # 选择使用的(激活函数)
- use_bias = True, # 是否使用(偏置项)
- kernel_initializer = None, # 卷积核的初始化器
- bias_initializer = tf.zeros_initializer(), # 偏置项的初始化器
- kernel_regularizer = None, # 卷积核的正则化
- activaty_regularizer = None, # 偏置项的正则化
- kernel_constraint = None, # 对主权重矩阵进行约束
- bias_constraint = None, # 对偏置向量进行约束
- trainable = True, # 可以设置为不可训练,(冻结)网络层
- name = None # 层的名字
- reuse = None # 是否重复使用参数
二、卷积层
卷积是神经网络中,用来对图片进行提取特征的一种运算,tensorflow中用到的类有三种:Conv1D(一维卷积)、Conv2D(二维卷积)、Conv3D(三维卷积),这三种卷积的简要区别可以点击这里,这里主要讨论Conv2D。下面是tensorflow对应的类与常用的参数说明:
tf.keras.layers.Conv2D()
- filter:卷积核的个数
- kernel_size:卷积核尺寸,正方形用一个整数表示即可;长方形需指明 高h, 核宽w,可以用列表或元组表示,如(h,w),[h,w].
- strides:滑动步长,默认横纵向滑动步长均为1,即(1,1),也可以设置其他步长(纵向步长h,横向步长w).
- padding:补零策略,padding = "SAME"需全零填充,padding = “VALID” 不需要区分大小写。注意此处不区分大小写。
- data_format:输入的数据格式,此处有两个取值,data_format = “channels_first” 或 data_format = "channels_last.输入的数据格式。默认取“channels_last”,即默认输入数据的格式中,通道数为最后一个。当data_format = "channels_first"的时候,输入和输出的shape格式为(batch_size, channels, height, width)即(图片数量,通道数,长,宽)。
- dalition_rate:卷积核的膨胀系数,格式为数组或列表,其作用是将卷积核进行形状膨胀,新的位置用0填充,新卷积核的尺寸和膨胀系数的计算公式如下:原卷积核的尺寸为S ,膨胀系数为k,则膨胀后的卷积核尺寸为size = k×(S-1)+1。
- activation:激活函数。相当于经过卷积输出后,在经过一次激活函数,常见的激活函数有relu,softmax,selu等。
三、池化层
池化的方式有两种,分别是MaxPool与AveragePool,池化也有一维池化,二维池化、三维池化。这里只讲二维池化,对应的类与常用参数说明:
tf.keras.layers.MaxPool2D()
- pool_size:池化窗口的维度,包括长和宽,默认是(2,2)。
- strides:卷积核在做池化时移动步幅的大小,默认与pool_size相同为(2,2)。
- padding:处理图像数据进行池化在边界补零的策略。SAME表示补零,VALID表示不补零。
- data_format:输入图像数据的格式,默认格式是channels_last,也可以是根据需要设置成channels_fitst。在进行图像数据处理时,图像数据的格式分为channels_last(batch, height, width, channels)和channels_first(batch, channels, height, width)两种。
四、BN层(batchnorm)
batchnorm的详细说明可以点击这里,batchnorm一般放在激活值与激活函数之间,训练的时候均值与方差用的是batch样本的方差,测试与预测时用的是每个batch的均值和方差平均之后得到的滑动均值与滑动方差。tensorflow的batchnorm类与常用参数如下:
tf.keras.layers.BatchNormalization()
axis
的值取决于按照input
的哪一个维度进行BN,例如输入为channel_last
format,即[batch_size, height, width, channel]
,则axis
应该设定为4,如果为channel_first
format,则axis
应该设定为1.momentum
的值用在训练时,滑动平均的方式计算滑动平均值moving_mean
和滑动方差moving_variance
。 后面做更详细的说明。center
为True
时,添加位移因子beta
到该BN层,否则不添加。添加beta
是对BN层的变换加入位移操作。注意,beta
一般设定为可训练参数,即trainable=True
。scale
为True时
,添加缩放因子gamma
到该BN层,否则不添加。添加gamma
是对BN层的变化加入缩放操作。注意,gamma
一般设定为可训练参数,即trainable=True
。training
表示模型当前的模式,如果为True
,则模型在训练模式,否则为推理模式。要非常注意这个模式的设定,这个参数默认值为False
。如果在训练时采用了默认值False
,则滑动均值moving_mean
和滑动方差moving_variance
都不会根据当前batch的数据更新,这就意味着在推理模式下,均值和方差都是其初始值,因为这两个值并没有在训练迭代过程中滑动更新。
五、激活层
激活函数,我们可以在创建全连接层Dense和卷积层Conv2d的时候定义,也可以先不定义,求出激活值之后再来定义一个激活层,tensorflow中的激活层及其参数为:
tf.keras.layers.Activation()
- activation:激活函数,可以是字符串"relu"、softmax,也可以是一个激活函数如tf.keras.activations.softmax
六、dropout
神经网络经常用到dropout来避免过拟合,详细说明可以点击这里,dropout在tensorflow中也是一以一个layer类的形式出现。
tf.keras.layers.Dropout()
- rate:在0到1之间浮动。要降低的输入单位的分数。
- noise_shape:1D张量类型,int32表示将与输入相乘的二进制丢失掩码的形状;例如,如果我们的输入具有形状(batch_size, timesteps, features),并且我们希望所有时间步长的丢失掩码相同,则可以使用noise_shape=[batch_size, 1, features].,就是哪一个是1,那么就在哪一维度按照相同的方式dropout,如果没有1就是普通的。
- seed:用作随机种子的Python整数
七、ZeroPadding
在进行Conv2D卷积操作的时候,如果参数padding='SAME'则会自动填充0来保证卷积,但是我们有时候可能需要自定义需要填充的多少行与宽,这时候就可以用ZeroPadding这个函数了(这里以图片的padding为例)。
tf.keras.layers.ZeroPadding2D()
-
padding:整数,或者2个整数的元组,或者2个整数的2个元组的元组
-
整数:以上下、左右对称的方式填充0
例子:1,表示上下各填充一行0,即:行数加2;左右各填充一列0,即:列数加2 -
2个整数的元组:第一个整数表示上下对称的方式填充0;第二个整数表示左右对称的方式填充0
例子:(1,1),表示上下各填充一行0,即:行数加2;左右各填充一列0,即:列数加2 -
2个整数的2个元组的元组:表示
((top_pad, bottom_pad), (left_pad, right_pad))
-
- data_format:字符串, “channels_last” (默认) 或 “channels_first”, 表示输入中维度的顺序。
-
- channels_last 对应输入形状 (batch, height, width, channels)
- channels_first 对应输入尺寸为 (batch, channels, height, width)。
八、其他layer类
这里只列出作用,不详细说明参数。
基础层:
tf.keras.layers.SpatialDropout2D():
空间随机置零层。训练期间以一定几率将整个特征图置0,一种正则化手段,有利于避免特征图之间过高的相关性。tf.keras.layers.Input():
输入层。通常使用Functional API方式构建模型时作为第一层tf.keras.layers.DenseFeature():
特征列接入层,用于接收一个特征列列表并产生一个密集连接层。tf.keras.layers.Flatten():
压平层,用于将多维张量压成一维。tf.keras.layers.Reshape():
形状重塑层,改变输入张量的形状。tf.keras.layers.Concatenate():
拼接层,将多个张量在某个维度上拼接。tf.keras.layers.Add():
加法层。tf.keras.layers.Subtract():
减法层。tf.keras.layers.Maximum():
取最大值层。tf.keras.layers.Minimum():
取最小值层。
卷积相关层:
tf.keras.layers.SeparableConv2D():
二维深度可分离卷积层。不同于普通卷积同时对区域和通道操作,深度可分离卷积先操作区域,再操作通道。即先对每个通道做独立卷即先操作区域,再用1乘1卷积跨通道组合即再操作通道。参数个数 = 输入通道数×卷积核尺寸 + 输入通道数×1×1×输出通道数。深度可分离卷积的参数数量一般远小于普通卷积,效果一般也更好。tf.keras.layers.DepthwiseConv2D():
二维深度卷积层。仅有SeparableConv2D前半部分操作,即只操作区域,不操作通道,一般输出通道数和输入通道数相同,但也可以通过设置depth_multiplier让输出通道为输入通道的若干倍数。输出通道数 = 输入通道数 × depth_multiplier。参数个数 = 输入通道数×卷积核尺寸× depth_multiplier。tf.keras.layers.Conv2DTranspose():
二维卷积转置层,俗称反卷积层。并非卷积的逆操作,但在卷积核相同的情况下,当其输入尺寸是卷积操作输出尺寸的情况下,卷积转置的输出尺寸恰好是卷积操作的输入尺寸。tf.keras.layers.LocallyConnected2D():
二维局部连接层。类似Conv2D,唯一的差别是没有空间上的权值共享,所以其参数个数远高于二维卷积。tf.keras.layers.MaxPooling2D():
二维最大池化层。也称作下采样层。池化层无参数,主要作用是降维。tf.keras.layers.AveragePooling2D():
二维平均池化层。tf.keras.layers.GlobalMaxPool2D():
全局最大池化层。每个通道仅保留一个值。一般从卷积层过渡到全连接层时使用,是Flatten的替代方案。tf.keras.layers.GlobalAvgPool2D():
全局平均池化层。每个通道仅保留一个值