keras 卷积 conv1D conv2D SeparableConv depthwiseConv

一句话卷积

本讲提要

这次结合代码跟大家分享四种卷积:一维卷积,二维卷积,以及基于它们的可分离卷积。

一维卷积

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共同学习共同进步,谢谢!

在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值