python 人脸识别:从入门到精通 (5.4)常用的神经网络层

第5章 深度学习与Keras工程实践

5.4 常用的神经网络层

5.4.1 全连接层

keras.layers.Dense(units,
                 activation=None,
                 use_bias=True,
                 kernel_initializer='glorot_uniform',
                 bias_initializer='zeros',
                 kernel_regularizer=None,
                 bias_regularizer=None,
                 activity_regularizer=None,
                 kernel_constraint=None,
                 bias_constraint=None,**kwargs)

units:正整数,输出空间的维数。
activation: 激活函数,如果未指定任何内容,则不会应用任何激活函数,即“线性”激活:a(x)= x
use_bias:Boolean,该层是否使用偏向量。
kernel_initializer:权重矩阵的初始化方法。
bias_initializer:偏向量的初始化方法。
kernel_regularizer:权重矩阵的正则化方法。
bias_regularizer:偏向量的正则化方法。
activity_regularizer:输出层正则化方法。
kernel_constraint:权重矩阵约束函数。
bias_constraint:偏向量约束函数。

5.4.2 二维卷积层

一维卷积主要用于时序数据处理,二维卷积用于对图像的空间卷积,三维卷积主要用于对立体空间卷积。

keras.layers.Conv2D(
	filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format=None,
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer='glorot_uniform',
    bias_initializer='zeros',
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    **kwargs
)
inputs:	把上一层的输出作为输入(直接将上一层作为参数输入即可)
input_shape: 当作为模型的第一层时,需要指出输入的形状(samples,rows,cols,channels),只指出后三维即可,第一维度按batch_size自动指定
filters: 卷积过滤器的数量,对应输出的维数
kernel_size: 整数,过滤器的大小,如果为一个整数则宽和高相同
strides: 横向和纵向的步长,如果为一个整数则横向和纵向相同
padding	valid: 表示不够卷积核大小的块,则丢弃;same表示不够卷积核大小的块就补0,所以输出和输入形状相同
data_format: channels_last为(batch,height,width,channels),
			 channels_first为(batch,channels,height,width)
dilation_rate: 一个整数,或者包含了两个整数的元组/队列,表示使用扩张卷积时的扩张率。如果是一个整数,则所有方向的扩张率相等。另外, strides 不等于1 和 dilation_rate 不等于1 这两种情况不能同时存在。
activation	激活函数,None是线性函数
use_bias	是否使用偏差量
kernel_initializer	卷积核的初始化。
bias_initializer	偏差向量的初始化。如果是None,则使用默认的初始值。
kernel_regularizer	卷积核的正则项
bias_regularizer	偏差向量的正则项
activity_regularizer	输出的正则函数
bias_constraint	映射函数,当偏差向量被Optimizer更新后应用到偏差向量上。
trainable	Boolean类型。
name	字符串,层的名字。
reuse	Boolean类型,表示是否可以重复使用具有相同名字的前一层的权重。

5.4.3 池化层

池化层也称为抽样层,是一种在图像的特定范围内聚合不同位置特征的操作。这是因为卷积之后的图像具有局部特征,并且图像的每个像素区域通常具有很高的相似性。图像区域中的特征平均值或者最大值可以用来表示该区域的整体特征。这样不仅可以压缩数据,还会改善结果,使得神经网络不会发生过拟合。

一般放在卷积层之后,减少数据量,起到降采样作用,可以进一步进行特征提取和压缩作用。

均值池化
随机池化
最大池化

池化层和卷积层配合使用的另一个好处是具有更好的平移不变性,因为图像平移前后的数据经过池化处理后的差距可能已经很小了。

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

pool_size: 整数,或者2个整数表示的元组,沿(垂直,水平)方向缩小比例的因数。 (22)会把输入张量的两个维度都缩小一半。 如果只使用一个整数,那么两个维度都会使用同样的窗口长度。

strides: 整数,2 个整数表示的元组,或者是 None。 表示步长值。 如果是 None,那么默认值是 pool_size。

padding: "valid" 或者 "same" (区分大小写)。

data_format: 字符串,channels_last (默认)或 channels_first 之一。 表示输入各维度的顺序。 channels_last 代表尺寸是 (batch, height, width, channels) 的输入张量, 而 channels_first 代表尺寸是 (batch, channels, height, width) 的输入张量。 默认值根据 Keras 配置文件 ~/.keras/keras.json 中的 image_data_format 值来设置。 如果还没有设置过,那么默认值就是 "channels_last"

全连接网络的一个最大缺点是参数大,而全局平均池化恰好可以代替卷积神经网络中的全连接层,可以减少参数量

全局平均池化:

keras.layers.GlobalAveragePooling2D(data_format=None)

全局最大池化:

keras.layers.GlobalMaxPooling2D(data_format=None)

5.4.4 BN层

批量标准化层
在训练时,对输入数据进行标准化,可以提高网络的训练速度
针对隐藏层,往往存在着Internal Covariate Shift现象,BN层解决这个问题
针对每一批次,每一层的激活值进行处理
python 人脸识别:从入门到精通 (5.4)常用的神经网络层_第1张图片
IID独立同分布假设就是假设训练数据与测试数据是满足相同分布的,那么通过训练数据获得的模型能够在测试集上获得较好的结果
BN使得每一层的神经网络输入保持相同的分布,实践中获得好的结果。

keras.layers.normalization.BatchNormalization(
	axis=-1, 
	momentum=0.99, 
	epsilon=0.001, 
	center=True, 
	scale=True, 
	beta_initializer='zeros', 
	gamma_initializer='ones', 	
	moving_mean_initializer='zeros', 
	moving_variance_initializer='ones', 
	beta_regularizer=None, gamma_regularizer=None, 
	beta_constraint=None, gamma_constraint=None)

该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接近0,其标准差接近1

  • axis: 整数,指定要规范化的轴,通常为特征轴。例如在进行- data_format="channels_first的2D卷积后,一般会设axis=1。
  • momentum: 动态均值的动量
  • epsilon:大于0的小浮点数,用于防止除0错误
  • center: 若设为True,将会将beta作为偏置加上去,否则忽略参数beta
  • scale: 若设为True,则会乘以gamma,否则不使用gamma。当下一层是线性的时,可以设False,因为scaling的操作将被下一层执行。
  • beta_initializer:beta权重的初始方法
  • gamma_initializer: gamma的初始化方法
  • moving_mean_initializer: 动态均值的初始化方法
  • moving_variance_initializer: 动态方差的初始化方法
  • beta_regularizer: 可选的beta正则
  • gamma_regularizer: 可选的gamma正则
  • beta_constraint: 可选的beta约束
  • gamma_constraint: 可选的gamma约束

5.4.5 Drouput层

对于全连接层,参数量过大,容易造成过拟合。Dropout层,在训练中,对于每一个神经元,有一定的概率剔除,暂时丢弃,故而每个批次都在训练不同的网络,增加了健壮性,减少过拟合。python 人脸识别:从入门到精通 (5.4)常用的神经网络层_第2张图片

keras.layers.Dropout(
	rate,
	noise_shape=None,
	seed=None
)
  • rate:0-1,指定需要断开的比例
  • noise_shape:表示将与输入数据相乘的二进制dropout掩层的形状,一般默认即可。
  • seed:随机数种子

5.4.6 Flatten层

将输入数据展平,不影响批量的大小。
我们将flatten层放置在卷积层和全连接层中间,起到转换作用,因为卷积层输出多个二维特征图,需要转换为向量序列的形式,才和全连接层一一对应。
python 人脸识别:从入门到精通 (5.4)常用的神经网络层_第3张图片

keras.layers.Flatten(data_format=None)

示例

from tensorflow import keras
from keras.models import Sequential
from keras.layers import Conv2D, Flatten
model = Sequential()
model.add(Conv2D(64, (3,3), input_shape=(3,32,32), padding='same'))
# model.output_shape===(None, 64, 32, 32)
model.add(Flatten())
# model.output_shape===(None, 65536)

你可能感兴趣的:(python 人脸识别:从入门到精通 (5.4)常用的神经网络层)