一句话卷积
本讲提要
这次结合代码跟大家分享四种卷积:一维卷积,二维卷积,以及基于它们的可分离卷积。
一维卷积
keras接口
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会在后面进行详细讲解,可以先不用
一维卷积的过程
layers.Conv1D(filters=2, kernel_size=4, use_bias=False)
以上面这个卷积层为例,它的工作过程如下:
在这个例子中,我们对一个全1的输入进行卷积操作,如图中所示的操作应该进行两次,因为我们指定的filters = 2
所以输入和输出的shape应该是
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如下所示
_________________________________________________________________ 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接口
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接口
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接口
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
卷积层还有几个操作,下周二分析
在这里附上实验代码
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))
认真写每一篇文章,认真分析每一个问题
如果觉得写的还可以,欢迎关注BBIT共同学习共同进步,谢谢!