畅游人工智能之海--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)

以上面这个卷积层为例,它的工作过程如下:

con1d

在这个例子中,我们对一个全1的输入进行卷积操作,如图中所示的操作应该进行两次,因为我们指定的filters = 2

所以输入和输出的shape应该是

1
2
3
4
5
6
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer) (None, 10, 3) 0
_________________________________________________________________
conv1d_1 (Conv1D) (None, 7, 2) 24
=================================================================

其它参数的含义

  • 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通道(上下)的二维数据

    picture2d
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from keras import layers
from keras.models import Model
import keras
input_num = 10
keras.backend.clear_session()
inputs = layers.Input((input_num, 3)) # 定义输入层
# out = layers.Conv1D(filters=2, kernel_size=4, padding='same',use_bias=False)(inputs)
out = layers.SeparableConv1D(filters=2,kernel_size=4,use_bias=False, depth_multiplier=1)(inputs)
model = Model(inputs=inputs, outputs=out)
model.summary()
print(model.get_weights())
lis = list(model.get_weights()[0])
print(sum(lis[0]),sum(lis[1]))
x = [[[1,1,1] for i in range(input_num)]]
import numpy as np
x = np.array(x)
print(model.predict(x))