畅游人工智能之海--Keras教程之池化层

畅游人工智能之海--Keras教程之池化层

各位读者大家好,上周我们详细讲解了Keras的核心网络层,相信大家已经对核心网络层的作用以及使用方法有了一个清晰的认识。这周我们将要开展池化层和卷积层的讲解了,这篇文章就是对池化层的讲解。

首先我们要统一说一下池化层的作用。池化层放在连续的卷积层中间,用于压缩数据和参数的量,防止过拟合。其具体操作与卷积层的操作基本相同,只不过池化层的卷积核只取对应位置的最大值、平均值等(最大池化、平均池化),且不经过反向传播的修改。总结一下,作用有两个:①invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度);②保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力。

池化层操作又分为平均池化和最大池化。根据相关理论,特征提取的误差主要来自两个方面:①邻域大小受限造成的估计值方差增大;②卷积层参数误差造成估计均值的偏移。一般来说,平均池化能减小第一种误差,更多地保留图像的背景信息,最大池化能减小第二种误差,更多地保留纹理信息。

池化层的操作方式我们可以通过以下的图片来清晰地了解。

最大池化图示

平均池化图示

全局池化操作即是对指定的张量的全局数据进行最大池化或者平均池化操作。池化层中的1D是对时序数据进行池化操作,2D是对空间数据进行池化操作,3D是对空间或时空间数据进行池化操作。

MaxPooling1D层
1
2
3
4
5
6
keras.layers.MaxPooling1D(
pool_size=2, #整数,最大池化的窗口大小
strides=None, #整数,或者是None。作为缩小比例的因数。例如,2会使得输入张量缩小一半。如果是None,那么默认值是pool_size。
padding='valid', #"valid" 或者 "same"(区分大小写)
data_format='channels_last' #字符串,channels_last(默认)或 channels_first之一。表示输入各维度的顺序。channels_last对应输入尺寸为(batch, steps, features),channels_first对应输入尺寸为(batch, features, steps)
)

输入尺寸:

如果 data_format='channels_last',输入为 3D 张量,尺寸为:(batch_size, steps, features)

如果data_format='channels_first',输入为 3D 张量,尺寸为:(batch_size, features, steps)

输出尺寸:

如果 data_format='channels_last',输出为 3D 张量,尺寸为:(batch_size, downsampled_steps, features)

如果data_format='channels_first',输出为 3D 张量,尺寸为:(batch_size, features, downsampled_steps)

MaxPooling2D
1
2
3
4
5
6
keras.layers.MaxPooling2D(
pool_size=(2, 2), #整数,或者2个整数表示的元组,沿(垂直,水平)方向缩小比例的因数。(2,2)会把输入张量的两个维度都缩小一半。如果只使用一个整数,那么两个维度都会使用同样的窗口长度。
strides=None, #整数,2个整数表示的元组,或者是None。表示步长值。如果是None,那么默认值是pool_size
padding='valid', #"valid" 或者 "same"(区分大小写)
data_format=None #字符串,channels_last(默认)或channels_first之一。表示输入各维度的顺序。channels_last代表尺寸是 (batch, height, width, channels)的输入张量,而channels_firs代表尺寸是(batch, channels, height, width)的输入张量
)

输入尺寸:

如果 data_format='channels_last: 尺寸是 (batch_size, rows, cols, channels)的 4D 张量

如果 data_format='channels_first': 尺寸是 (batch_size, channels, rows, cols)的 4D 张量

输出尺寸:

如果 data_format='channels_last: 尺寸是 (batch_size, pooled_rows, pooled_cols, channels)的 4D 张量

如果 data_format='channels_first': 尺寸是 (batch_size, channels, pooled_rows, pooled_cols)的 4D 张量

MaxPooling3D
1
2
3
4
5
6
keras.layers.MaxPooling3D(
pool_size=(2, 2, 2), #3个整数表示的元组,缩小(dim1,dim2,dim3)比例的因数。(2, 2, 2)会把 3D 输入张量的每个维度缩小一半
strides=None, #3个整数表示的元组,或者是None。表示步长值,意义同上几个层
padding='valid', #"valid" 或者 "same"(区分大小写)
data_format=None #字符串,channels_last(默认)或channels_first之一。表示输入各维度的顺序。channels_last代表尺寸是(batch, spatial_dim1, spatial_dim2, spatial_dim3, channels)的输入张量,而channels_first代表尺寸是(batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)的输入张量
)

输入大小:

如果data_format='channels_last': 尺寸是 (batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)的 5D 张量

如果data_format='channels_first': 尺寸是 (batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)的 5D 张量

输出大小:

如果data_format='channels_last': 尺寸是 (batch_size, pooled_dim1, pooled_dim2, pooled_dim3, channels)的 5D 张量

如果data_format='channels_first': 尺寸是 (batch_size, channels, pooled_dim1, pooled_dim2, pooled_dim3)的 5D 张量

AveragePooling1D
1
2
3
4
5
6
keras.layers.AveragePooling1D(
pool_size=2, #整数,平均池化的窗口大小
strides=None, #整数,或者是None。作为缩小比例的因数。例如,2会使得输入张量缩小一半。如果是None,那么默认值是pool_size。
padding='valid', #"valid" 或者 "same"(区分大小写)
data_format='channels_last' #字符串,channels_last(默认)或 channels_first之一。表示输入各维度的顺序。channels_last对应输入尺寸为(batch, steps, features),channels_first对应输入尺寸为(batch, features, steps)
)

输入尺寸:

如果 data_format='channels_last',输入为 3D 张量,尺寸为:(batch_size, steps, features)

如果data_format='channels_first',输入为 3D 张量,尺寸为:(batch_size, features, steps)

输出尺寸:

如果 data_format='channels_last',输出为 3D 张量,尺寸为:(batch_size, downsampled_steps, features)

如果data_format='channels_first',输出为 3D 张量,尺寸为:(batch_size, features, downsampled_steps)

AveragePooling2D
1
2
3
4
5
6
keras.layers.AveragePooling2D(
pool_size=(2, 2), #整数,或者2个整数表示的元组,沿(垂直,水平)方向缩小比例的因数。(2,2)会把输入张量的两个维度都缩小一半。如果只使用一个整数,那么两个维度都会使用同样的窗口长度。
strides=None, #整数,2个整数表示的元组,或者是None。表示步长值。如果是None,那么默认值是pool_size
padding='valid', #"valid" 或者 "same"(区分大小写)
data_format=None #字符串,channels_last(默认)或channels_first之一。表示输入各维度的顺序。channels_last代表尺寸是 (batch, height, width, channels)的输入张量,而channels_firs代表尺寸是(batch, channels, height, width)的输入张量
)

输入尺寸:

如果 data_format='channels_last: 尺寸是 (batch_size, rows, cols, channels)的 4D 张量

如果 data_format='channels_first': 尺寸是 (batch_size, channels, rows, cols)的 4D 张量

输出尺寸:

如果 data_format='channels_last: 尺寸是 (batch_size, pooled_rows, pooled_cols, channels)的 4D 张量

如果 data_format='channels_first': 尺寸是 (batch_size, channels, pooled_rows, pooled_cols)的 4D 张量

AveragePooling3D
1
2
3
4
5
6
keras.layers.AveragePooling3D(
pool_size=(2, 2, 2), #3个整数表示的元组,缩小(dim1,dim2,dim3)比例的因数。(2, 2, 2)会把 3D 输入张量的每个维度缩小一半
strides=None, #3个整数表示的元组,或者是None。表示步长值,意义同上几个层
padding='valid', #"valid" 或者 "same"(区分大小写)
data_format=None #字符串,channels_last(默认)或channels_first之一。表示输入各维度的顺序。channels_last代表尺寸是(batch, spatial_dim1, spatial_dim2, spatial_dim3, channels)的输入张量,而channels_first代表尺寸是(batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)的输入张量
)

输入大小:

如果data_format='channels_last': 尺寸是 (batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)的 5D 张量

如果data_format='channels_first': 尺寸是 (batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)的 5D 张量

输出大小:

如果data_format='channels_last': 尺寸是 (batch_size, pooled_dim1, pooled_dim2, pooled_dim3, channels)的 5D 张量

如果data_format='channels_first': 尺寸是 (batch_size, channels, pooled_dim1, pooled_dim2, pooled_dim3)的 5D 张量

GlobalMaxPooling1D
1
2
3
keras.layers.GlobalMaxPooling1D(
data_format='channels_last' #同上1D层
)

输入尺寸:

如果 data_format='channels_last',输入为 3D 张量,尺寸为:(batch_size, steps, features)

如果data_format='channels_first',输入为 3D 张量,尺寸为:(batch_size, features, steps)

输出尺寸:

尺寸是 (batch_size, features) 的 2D 张量。

GlobalMaxPooling2D
1
2
3
keras.layers.GlobalMaxPooling3D(
data_format='channels_last' #同上2D层
)

输入尺寸:

如果 data_format='channels_last: 尺寸是 (batch_size, rows, cols, channels)的 4D 张量

如果 data_format='channels_first': 尺寸是 (batch_size, channels, rows, cols)的 4D 张量

输出尺寸:

尺寸是 (batch_size, channels) 的 2D 张量。

GlobalMaxPooling3D
1
2
3
keras.layers.GlobalMaxPooling3D(
data_format='channels_last' #同上3D层
)

输入大小:

如果data_format='channels_last': 尺寸是 (batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)的 5D 张量

如果data_format='channels_first': 尺寸是 (batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)的 5D 张量

输出尺寸:

尺寸是 (batch_size, channels) 的 2D 张量。

GlobalAveragePooling1D
1
2
3
keras.layers.GlobalAveragePooling1D(
data_format='channels_last' #同上1D层
)

输入尺寸:

如果 data_format='channels_last',输入为 3D 张量,尺寸为:(batch_size, steps, features)

如果data_format='channels_first',输入为 3D 张量,尺寸为:(batch_size, features, steps)

输出尺寸:

尺寸是 (batch_size, features) 的 2D 张量。

GlobalAveragePooling2D
1
2
3
keras.layers.GlobalAveragePooling2D(
data_format='channels_last' #同上2D层
)

输入尺寸:

如果 data_format='channels_last: 尺寸是 (batch_size, rows, cols, channels)的 4D 张量

如果 data_format='channels_first': 尺寸是 (batch_size, channels, rows, cols)的 4D 张量

输出尺寸:

尺寸是 (batch_size, channels) 的 2D 张量。

GlobalAveragePooling3D
1
2
3
keras.layers.GlobalAveragePooling3D(
data_format='channels_last' #同上3D层
)

输入大小:

如果data_format='channels_last': 尺寸是 (batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)的 5D 张量

如果data_format='channels_first': 尺寸是 (batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)的 5D 张量

输出尺寸:

尺寸是 (batch_size, channels) 的 2D 张量。

相信大家经过今天的学习,能够获得对池化层的作用以及使用方式的认识,池化层是卷积神经网络的重要组成部分,希望大家在课下可以多多找实例进行再进一步的了解,让我们一起期待明天的卷积层教程吧!