文章来自微信公众号:【机器学习炼丹术】。作者WX:cyx645016617.
参考目录:
和卷积层相对应,每一种池化层都有1D,2D,3D
三种类型,这里主要介绍2D处理图像的一个操作。1D和3D可以合理的类推。
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就行了。
和上面的最大池化层同理,这里就展示一个API就不再多说了。
tf.keras.layers.AveragePooling2D(
pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs
)
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 × 28 28\times 28 28×28,所以这里的全局最大池化层等价于pool_size=28
的最大池化层。
与上面的全局最大池化层等价。
tf.keras.layers.GlobalAveragePooling2D(data_format=None, **kwargs)
Keras官方只提供了两种Normalization的方法,一个是BatchNormalization,一个是LayerNormalization。虽然没有提供InstanceNormalization和GroupNormalization的方法,我们可以通过修改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
)
我们来详细讲解一下参数:
channels_first
,那么需要设置axis=1.这里需要注意的一点是,keras的API中并没有像PyTorch的API中的这个参数group,这样的话,就无法衍生成GN和InstanceN层了,在之后的内容,会在Tensorflow_Addons库中介绍
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这几个归一化层的详细原理,不了解的可以看本文最后的相关链接中找一找。