基于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利用elaphe制作二维条形码实现代码
May 25 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
python3转换code128条形码的方法
Apr 17 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
浅谈pycharm使用及设置方法
Sep 09 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
Selenium 安装和简单使用的实现
Dec 04 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
python 模拟登陆163邮箱
Dec 15 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
ThinkPHP中Session用法详解
2014/11/29 PHP
10个简化PHP开发的工具
2014/12/25 PHP
laravel 数据验证规则详解
2019/10/23 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
node 标准输入流和输出流代码实例
2019/09/19 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
is_file和file_exists效率比较
2021/03/14 PHP
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
2013年大学生的自我鉴定
2013/10/24 职场文书
2014年教师节寄语
2014/04/03 职场文书
具结保证书
2015/01/17 职场文书
婚宴来宾致辞
2015/07/28 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
python随机打印成绩排名表
2021/06/23 Python
Java基础之this关键字的使用
2021/06/30 Java/Android