1、tf.keras.layers.Conv1D函数
函数原型
tf.keras.layers.Conv1D(filters,
kernel_size,
strides=1,
padding='valid',
data_format='channels_last',
dilation_rate=1,
groups=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
)
函数说明
一维卷积层用于在单个空间或者时间维度上进行卷积。通常用于序列模型、自然语言处理领域。
卷积过程如上图所示,输入向量的大小为20,卷积核大小为5,步长(每一步移动距离)为1,不考虑填充,那么输出向量的大小为(20 - 5) / 1 + 1 = 16;如果考虑填充,那么输出向量大小为20 / 1 = 20。
更一般的,假设输入向量大小为F,卷积核大小为K, 步长为S,填充方式为“VALID”(也就是不考虑填充),那么输出向量大小N= (F - K / S) + 1;如果填充方式为“SAME”(不考虑步长,使输入矩阵和输出矩阵大小一样),则输出向量大小N = F / S
参数filters是输出空间的维度,一般对输入数据的最后一个维度进行改变。对于一维卷积层,输入数据通常是三维的,形状为(batch_size, d_size, n_dim),batch_size表示批处理数据的数量,d_size表示每一个数据的大小,n_dim表示数据元素的维度。
参数kernel_size表示卷积核的大小;参数strides表示步长,默认为1;padding则表示填充方式,默认为VALID,也就是不填充。
另外还有一些常用到的参数,比如activation表示激活函数,use_bias表示是否使用偏置矩阵,默认为True,kernel_initializer表示使用的核矩阵,bias_initializer表示使用的偏置矩阵。
还有三个参数kernel_regularizer、bias_regularizer、activity_regularizer分别用于通过正则化器计算核矩阵、偏置矩阵、经过激活函数的输出矩阵的loss。该层输出后,tf.losses中的loss损失函数会获取该loss。
正则化器主要用来预防过拟合,有两种常用的正则化器L1和L2,它们计算损失函数的方式不一样。
L1计算损失loss的方式 loss = l1 * reduce_sum(abs(x)),其中l1=0.01;L2计算损失loss的方式loss = l2 * reduce_sum(square(x)),其中l2=0.01。
该层如果作为第一层,则需要提供一个参数input_shape来指定输入张量的大小。
函数用法
第一个例子
model = tf.keras.Sequential([
# 一维卷积层,输出形状为(None, 16, 8),定义input_shape作为第一层
tf.keras.layers.Conv1D(8, 5, activation="relu", input_shape=(20, 1)),
# 一维最大池化层,输出形状为(None, 8, 8)
tf.keras.layers.MaxPooling1D(2),
# 展平层
tf.keras.layers.Flatten(),
# 全连接层
tf.keras.layers.Dense(4)
])
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d (Conv1D) (None, 16, 8) 48
max_pooling1d (MaxPooling1D (None, 8, 8) 0
)
flatten (Flatten) (None, 64) 0
dense (Dense) (None, 4) 260
=================================================================
Total params: 308
Trainable params: 308
Non-trainable params: 0
_________________________________________________________________
第二个例子
model = tf.keras.Sequential([
# 输入层,输出形状为(None, 20, 1)
tf.keras.layers.InputLayer(input_shape=(20, 1)),
# 一维卷积层,输出形状为(None, 16, 8)
tf.keras.layers.Conv1D(8, 5, activation="relu"),
# 一维最大池化层,输出形状为(None, 8, 8)
tf.keras.layers.MaxPooling1D(2),
# 一维卷积层
tf.keras.layers.Conv1D(16, 3, activation="relu"),
# 一维最大池化层
tf.keras.layers.MaxPooling1D(2),
# 展平层
tf.keras.layers.Flatten(),
# 全连接层
tf.keras.layers.Dense(4)
])
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d (Conv1D) (None, 16, 8) 48
max_pooling1d (MaxPooling1D (None, 8, 8) 0
)
conv1d_1 (Conv1D) (None, 6, 16) 400
max_pooling1d_1 (MaxPooling (None, 3, 16) 0
1D)
flatten (Flatten) (None, 48) 0
dense (Dense) (None, 4) 196
=================================================================
Total params: 644
Trainable params: 644
Non-trainable params: 0
_________________________________________________________________
2、tf.keras.layers.Conv2D函数
函数原型
tf.keras.layers.Conv2D(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
groups=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
)
函数说明
二维卷积层一般用于图像处理、计算机视觉领域。在两个维度上面进行卷积。
二维卷积的操作与一位卷积的操作类似,只是增加了一个维度。如上图所示,输入矩阵的大小为5×5,卷积核矩阵的大小为3×3,在x, y 方向移动步长为(1, 1),采用了填充的方式(SAME)进行卷积。结果得到一个与输入矩阵大小一样的矩阵(5×5)。
二维卷积的计算公式与一维卷积的计算公式类似,假设输入图像的大小为F×F,卷积核矩阵大小为K×K,步长为(S,S),如果填充方式为VALID,输出图像大小为N×N,则有N = (F - K / S) + 1;如果填充方式为SAME,则有N = F / S。
参数filters、kernel_size、strides、padding等等,这些参数的含义与一维卷积层中对应的参数的含义一样,不同的是参数的形式不同。比如在Conv1D中kernel_size=5表示卷积核的大小为5,在Conv2D中kernel_size就应该为(5, 5)表示卷积核的大小为5×5。
参数dilation_rate表示扩张率,用于核矩阵的扩张。可以是单个整数,为所有空间维度指定相同的值。
二维卷积层的输入数据必须是四维的,形状为(batch_size, height, width, channels),batch_size表示批处理数据的大小,height表示数据的高度,width表示数据的宽度,channels表示通道数。
函数使用
model = tf.keras.Sequential([
# 输入层,输出形状(None, 128, 128, 3)
tf.keras.layers.InputLayer(input_shape=(128, 128, 3)),
# 二维卷积层,输出形状(None, 42, 42, 16)
tf.keras.layers.Conv2D(16, (5, 5), (3, 3), activation="relu"),
# 二维最大池化层,输出形状(None, 21, 21, 16)
tf.keras.layers.MaxPooling2D((2, 2)),
# 二维卷积层,输出形状(None, 5, 5, 32)
tf.keras.layers.Conv2D(32, (5, 5), (4, 4), activation="relu"),
# 二维最大池化层,输出形状(None, 1, 1, 32)
tf.keras.layers.MaxPooling2D((5, 5)),
# 展平层,输出形状(None, 32)
tf.keras.layers.Flatten(),
# 全连接层,输出形状(None, 4)
tf.keras.layers.Dense(4)
])
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 42, 42, 16) 1216
max_pooling2d (MaxPooling2D (None, 21, 21, 16) 0
)
conv2d_1 (Conv2D) (None, 5, 5, 32) 12832
max_pooling2d_1 (MaxPooling (None, 1, 1, 32) 0
2D)
flatten (Flatten) (None, 32) 0
dense (Dense) (None, 4) 132
=================================================================
Total params: 14,180
Trainable params: 14,180
Non-trainable params: 0
_________________________________________________________________
3、tf.keras.layers.Conv3D函数
函数原型
tf.keras.layers.Conv3D(
filters,
kernel_size,
strides=(1, 1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1, 1),
groups=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
)
函数说明
三维卷积层用于医学领域、视频处理领域(检测人物行为),用于三个维度的卷积。
三维卷积对数据集应用三维过滤器,过滤器向3个方向(x,y,z)移动,计算低层特征表示。输出形状是一个三维体积空间,如立方体或长方体。有助于视频、三维医学图像等的目标物检测。
参数的含义与Conv1D和Conv2D类似,这里不再赘述。三维卷积的输入形状为五维张量(batch_size, frames, height, width, channels),batch_size为批处理数据的大小,frams可以理解为视频中的帧数,其中每一帧为一幅图像,height为图像的高度,width为图像的宽度,channels为图像通道数。输出形状也是一个五维张量。
函数使用
model = tf.keras.Sequential([
# 输入层,输出形状(None, 128, 128, 128, 3)
tf.keras.layers.InputLayer(input_shape=(128, 128, 128, 3)),
# 三维卷积层,输出形状(None, 42, 42, 42, 16)
tf.keras.layers.Conv3D(16, (5, 5, 5), (3, 3, 3), activation="relu"),
# 三维最大池化层,输出形状(None, 21, 21, 21, 16)
tf.keras.layers.MaxPooling3D((2, 2, 2)),
# 三维卷积层,输出形状(None, 5, 5, 5, 32)
tf.keras.layers.Conv3D(32, (5, 5, 5), (4, 4, 4), activation="relu"),
# 三维最大池化层,输出形状(None, 1, 1, 1, 32)
tf.keras.layers.MaxPooling3D((5, 5, 5)),
# 展平层,输出形状(None, 32)
tf.keras.layers.Flatten(),
# 全连接层,输出形状为(None, 16)
tf.keras.layers.Dense(16, activation="relu"),
# 全连接层,输出形状(None, 4)
tf.keras.layers.Dense(4, activation="tanh")
])
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv3d (Conv3D) (None, 42, 42, 42, 16) 6016
max_pooling3d (MaxPooling3D (None, 21, 21, 21, 16) 0
)
conv3d_1 (Conv3D) (None, 5, 5, 5, 32) 64032
max_pooling3d_1 (MaxPooling (None, 1, 1, 1, 32) 0
3D)
flatten (Flatten) (None, 32) 0
dense (Dense) (None, 16) 528
dense_1 (Dense) (None, 4) 68
=================================================================
Total params: 70,644
Trainable params: 70,644
Non-trainable params: 0
_________________________________________________________________