基于Keras中Conv1D和Conv2D的区别说明


Posted in Python onJune 19, 2020

如有错误,欢迎斧正。

我的答案是,在Conv2D输入通道为1的情况下,二者是没有区别或者说是可以相互转化的。首先,二者调用的最后的代码都是后端代码(以TensorFlow为例,在tensorflow_backend.py里面可以找到):

x = tf.nn.convolution(
 input=x,
 filter=kernel,
 dilation_rate=(dilation_rate,),
 strides=(strides,),
 padding=padding,
 data_format=tf_data_format)

区别在于input和filter传递的参数不同,input不必说,filter=kernel是什么呢?

我们进入Conv1D和Conv2D的源代码看一下。他们的代码位于layers/convolutional.py里面,二者继承的都是基类_Conv(Layer)。

进入_Conv类查看代码可以发觉以下代码:

self.kernel_size = conv_utils.normalize_tuple(kernel_size, rank, 'kernel_size')
……#中间代码省略
input_dim = input_shape[channel_axis]
kernel_shape = self.kernel_size + (input_dim, self.filters)

我们假设,Conv1D的input的大小是(600,300),而Conv2D的input大小是(m,n,1),二者kernel_size为3。

进入conv_utils.normalize_tuple函数可以看到:

def normalize_tuple(value, n, name):
 """Transforms a single int or iterable of ints into an int tuple.
 # Arguments
 value: The value to validate and convert. Could an int, or any iterable
  of ints.
 n: The size of the tuple to be returned.
 name: The name of the argument being validated, e.g. "strides" or
  "kernel_size". This is only used to format error messages.
 # Returns
 A tuple of n integers.
 # Raises
 ValueError: If something else than an int/long or iterable thereof was
 passed.
 """
 if isinstance(value, int):
 return (value,) * n
 else:
 try:
  value_tuple = tuple(value)
 except TypeError:
  raise ValueError('The `' + name + '` argument must be a tuple of ' +
    str(n) + ' integers. Received: ' + str(value))
 if len(value_tuple) != n:
  raise ValueError('The `' + name + '` argument must be a tuple of ' +
    str(n) + ' integers. Received: ' + str(value))
 for single_value in value_tuple:
  try:
  int(single_value)
  except ValueError:
  raise ValueError('The `' + name + '` argument must be a tuple of ' +
     str(n) + ' integers. Received: ' + str(value) + ' '
     'including element ' + str(single_value) + ' of type' +
     ' ' + str(type(single_value)))
 return value_tuple

所以上述代码得到的kernel_size是kernel的实际大小,根据rank进行计算,Conv1D的rank为1,Conv2D的rank为2,如果是Conv1D,那么得到的kernel_size就是(3,)如果是Conv2D,那么得到的是(3,3)

input_dim = input_shape[channel_axis] kernel_shape = self.kernel_size + (input_dim, self.filters)

又因为以上的inputdim是最后一维大小(Conv1D中为300,Conv2D中为1),filter数目我们假设二者都是64个卷积核。

因此,Conv1D的kernel的shape实际为:

(3,300,64)

而Conv2D的kernel的shape实际为:

(3,3,1,64)

刚才我们假设的是传参的时候kernel_size=3,如果,我们将传参Conv2D时使用的的kernel_size设置为自己的元组例如(3,300),那么传根据conv_utils.normalize_tuple函数,最后的kernel_size会返回我们自己设置的元组,也即(3,300)那么Conv2D的实际shape是:

(3,300,1,64),也即这个时候的Conv1D的大小reshape一下得到,二者等价。

换句话说,Conv1D(kernel_size=3)实际就是Conv2D(kernel_size=(3,300)),当然必须把输入也reshape成(600,300,1),即可在多行上进行Conv2D卷积。

这也可以解释,为什么在Keras中使用Conv1D可以进行自然语言处理,因为在自然语言处理中,我们假设一个序列是600个单词,每个单词的词向量是300维,那么一个序列输入到网络中就是(600,300),当我使用Conv1D进行卷积的时候,实际上就完成了直接在序列上的卷积,卷积的时候实际是以(3,300)进行卷积,又因为每一行都是一个词向量,因此使用Conv1D(kernel_size=3)也就相当于使用神经网络进行了n_gram=3的特征提取了。

这也是为什么使用卷积神经网络处理文本会非常快速有效的内涵。

补充知识:Conv1D、Conv2D、Conv3D

由于计算机视觉的大红大紫,二维卷积的用处范围最广。因此本文首先介绍二维卷积,之后再介绍一维卷积与三维卷积的具体流程,并描述其各自的具体应用。

1. 二维卷积

基于Keras中Conv1D和Conv2D的区别说明

图中的输入的数据维度为

上述内容没有引入channel的概念,也可以说channel的数量为1。如果将二维卷积中输入的channel的数量变为3,即输入的数据维度变为(

以上都是在过滤器数量为1的情况下所进行的讨论。如果将过滤器的数量增加至16,即16个大小为

二维卷积常用于计算机视觉、图像处理领域。

2. 一维卷积

基于Keras中Conv1D和Conv2D的区别说明

图中的输入的数据维度为8,过滤器的维度为5。与二维卷积类似,卷积后输出的数据维度为

如果过滤器数量仍为1,输入数据的channel数量变为16,即输入数据维度为

如果过滤器数量为

一维卷积常用于序列模型,自然语言处理领域。

3. 三维卷积

基于Keras中Conv1D和Conv2D的区别说明

这里采用代数的方式对三维卷积进行介绍,具体思想与一维卷积、二维卷积相同。

假设输入数据的大小为

基于上述情况,三维卷积最终的输出为

三维卷积常用于医学领域(CT影响),视频处理领域(检测动作及人物行为)。

以上这篇基于Keras中Conv1D和Conv2D的区别说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python获取文件ssdeep值的方法
Oct 05 Python
Python类定义和类继承详解
May 08 Python
python 网络爬虫初级实现代码
Feb 27 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
深入了解Python 变量作用域
Jul 24 Python
详解python with 上下文管理器
Sep 02 Python
Python魔术方法专题
Jun 19 #Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 #Python
如何对python的字典进行排序
Jun 19 #Python
浅谈Python中的继承
Jun 19 #Python
python程序需要编译吗
Jun 19 #Python
python中round函数如何使用
Jun 19 #Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 #Python
You might like
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
layui使用label标签的方法
2019/09/14 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python