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
_________________________________________________________________