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。 后面做更详细的说明。
  • centerTrue时,添加位移因子beta到该BN层,否则不添加。添加beta是对BN层的变换加入位移操作。注意,beta一般设定为可训练参数,即trainable=True
  • scaleTrue时,添加缩放因子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(): 全局平均池化层。每个通道仅保留一个值
posted @ 2020-11-25 16:35  我不是高斯分布  阅读(4354)  评论(0编辑  收藏  举报