基于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多进程操作实例
Nov 21 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
用Python实现服务器中只重载被修改的进程的方法
Apr 30 Python
Python中使用items()方法返回字典元素对的教程
May 21 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
多版本Python共存的配置方法
May 22 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
Python2实现的图片文本识别功能详解
Jul 11 Python
基于python历史天气采集的分析
Feb 14 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
python实现npy格式文件转换为txt文件操作
Jul 01 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
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
手机端转换rem适应
2017/04/01 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
python继承和抽象类的实现方法
2015/01/14 Python
详解python中的 is 操作符
2017/12/26 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
对python中的装包与解包实例详解
2019/08/24 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
详解Python设计模式之策略模式
2020/06/15 Python
如何利用python进行时间序列分析
2020/08/04 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
详解HTML5中的标签
2015/06/19 HTML / CSS
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
红旗团支部事迹材料
2014/01/27 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
高校教师个人总结
2015/02/10 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
实习报告范文
2019/07/30 职场文书
js判断两个数组相等的5种方法
2022/05/06 Javascript
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang