文章来自微信公众号:【机器学习炼丹术】。作者WX:cyx645016617.
参考目录:
目录
下篇的内容中,主要讲解这些内容:
四个的池化层;
两个Normalization层;
1 池化层
和卷积层相对应,每一种池化层都有 1D,2D,3D
三种类型,这里主要介绍2D处理图像的一个操作。1D和3D可以合理的类推。
1.1 最大池化层
tf.keras.layers.MaxPooling2D( pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs )
这个strides在默认的情况下就是步长为2下面看个例子:
import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.MaxPooling2D( pool_size=(2,2)) print(y(x).shape) >>> (4, 14, 14, 3)
如果你把strides改成1:
import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.MaxPooling2D( pool_size=(2,2), strides = 1) print(y(x).shape) >>> (4, 27, 27, 3)
如果再把padding改成 ‘same’
:
import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.MaxPooling2D( pool_size=(2,2), strides = 1, padding='same') print(y(x).shape) >>> (4, 28, 28, 3)
这个padding默认是 'valid'
,一般strides为2,padding是valid就行了。
1.2 平均池化层
和上面的最大池化层同理,这里就展示一个API就不再多说了。
tf.keras.layers.AveragePooling2D( pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs )
1.3 全局最大池化层
tf.keras.layers.GlobalMaxPooling2D(data_format=None, **kwargs)
这个其实相当于 pool_size
等于特征图尺寸的一个最大池化层。看一个例子:
import tensorflow as tf x = tf.random.normal((4,28,28,3)) y = tf.keras.layers.GlobalMaxPooling2D() print(y(x).shape) >>> (4, 3)
可以看到,一个通道只会输出一个值,因为我们的输入特征图的尺寸是 \(28\times 28\) ,所以这里的全局最大池化层等价于 pool_size=28
的最大池化层。
1.4 全局平均池化层
与上面的全局最大池化层等价。
tf.keras.layers.GlobalAveragePooling2D(data_format=None, **kwargs)
2 Normalization
Keras官方只提供了两种Normalization的方法,一个是BatchNormalization,一个是LayerNormalization。虽然没有提供InstanceNormalization和GroupNormalization的方法,我们可以通过修改BN层的参数来构建。
2.1 BN
tf.keras.layers.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, renorm=False, renorm_clipping=None, renorm_momentum=0.99, fused=None, trainable=True, virtual_batch_size=None, adjustment=None, name=None, **kwargs )
我们来详细讲解一下参数:
axis :整数。表示哪一个维度是通道数维度,默认是-1,表示是最后一个维度。如果之前设置了 channels_first
,那幺需要设置axis=1.
momentum :当training过程中,Batch的均值方差会根据batch计算出来,在预测或者验证的时候,这个均值方差是采用training过程中计算出来的滑动均值和滑动方差的。具体的计算过程是:
epsilon :一个防止运算除法除以0的一个极小数,一般不做修改;
center :True的话,则会有一个可训练参数beta,也就是beta均值的这个offset;如果是False的话,这个BN层则退化成以0为均值,gamma为标准差的Normalization。默认是True,一般不做修改。
scale :与center类似,默认是True。如果是False的话,则不使用gamma参数,BN层退化成以beta为均值,1为标准差的Normalization层。
其他都是初始化的方法和正则化的方法,一般不加以限制,使用的方法在上节课也已经讲解了,在此不加赘述。
这里需要注意的一点是,keras的API中并没有像PyTorch的API中的这个参数group,这样的话,就无法衍生成GN和InstanceN层了,在之后的内容,会在Tensorflow_Addons库中介绍
2.2 LN
tf.keras.layers.LayerNormalization( axis=-1, epsilon=0.001, center=True, scale=True, beta_initializer="zeros", gamma_initializer="ones", beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None, trainable=True, name=None, **kwargs )
参数和BN的参数基本一致。直接看一个例子:
import tensorflow as tf import numpy as np x = tf.constant(np.arange(10).reshape(5,2)*10, dtype=tf.float32) print(x) y = tf.keras.layers.LayerNormalization(axis=1) print(y(x))
运行结果为:
tf.Tensor( [[ 0. 10.] [20. 30.] [40. 50.] [60. 70.] [80. 90.]], shape=(5, 2), dtype=float32) tf.Tensor( [[-0.99998 0.99998] [-0.99998 0.99998] [-0.99998 0.99998] [-0.99998 0.99998] [-0.99998 0.99998]], shape=(5, 2), dtype=float32)
我在之前的文章中已经介绍过了LN,BN,GN,IN这几个归一化层的详细原理,不了解的可以看本文最后的相关链接中找一找。
Be First to Comment