畅游人工智能之海--Keras教程之卷积层
畅游人工智能之海--Keras教程之卷积层
本讲提要
这次结合代码跟大家分享四种卷积:一维卷积,二维卷积,以及基于它们的可分离卷积。
一维卷积
keras接口
1 | keras.layers.Conv1D(filters, kernel_size, strides=1, padding='valid', data_format='channels_last', dilation_rate=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) |
其中的regularizer和constraint会在后面进行详细讲解,可以先不用
一维卷积的过程
1 | layers.Conv1D(filters=2, kernel_size=4, use_bias=False) |
以上面这个卷积层为例,它的工作过程如下:

在这个例子中,我们对一个全1的输入进行卷积操作,如图中所示的操作应该进行两次,因为我们指定的filters = 2
所以输入和输出的shape应该是
1 | Layer (type) Output Shape Param # |
其它参数的含义
strides 指的是卷积核每次滑动的长度,图中卷积核每次滑动一格,默认值是1
padding 指是不是要对结果进行扩充,它的默认取值是‘valid’,默认情况下不产生任何变化,还可以取'causal'和'same',以增强对边缘数据的特征提取,处理之后的shape如下所示
1
2
3
4
5
6
7_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 10, 3) 0
_________________________________________________________________
conv1d_1 (Conv1D) (None, 10, 2) 24
=================================================================data_format 没什么用,直接用默认值就行了,这个变量是在规定每个输入的含义,它有两个取值’channels_last‘和’channels_first‘,默认是第一个,也就是默认的输入是 (batch, steps, channels) 这样的,而第二个种对应的输入应该是 (batch, channels, steps) 这样的。
dilation_rate 会对卷积核进行扩充,但是不改变原始的卷积核
二维卷积
keras接口
1 | keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 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) |
与一维相比发生的变化
input 单条数据从二维变成三维,如图所示展示的是一个3通道(上下)的二维数据
kernel_size 应该是一个二元组,这个二元组指的是在一个通道内对数据的卷积
可分离卷积
keras接口
1 | keras.layers.SeparableConv1D(filters, kernel_size, strides=1, padding='valid', data_format='channels_last', dilation_rate=1, depth_multiplier=1, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None)# 这是一维的接口,二维的类似,就不占位置了 |
发生的变化
用不同的卷积核在各个通道上进行卷积,然后再用一个卷积核将不同的通道合并
depth_multiplier 可以把一个通道卷积之后的结果变成多个通道,其实也就是多次卷积,但是需要注意的是整个卷积层最后输出的shape不变
depthwise
keras接口
1 | keras.layers.DepthwiseConv2D(kernel_size, strides=(1, 1), padding='valid', depth_multiplier=1, data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, depthwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, bias_constraint=None) |
解释
其实就是可分离卷积的第一步,keras的制作者把它单独提出来做成了一个接口
ending
卷积层还有几个操作,下周二分析
在这里附上实验代码
1 | from keras import layers |