基于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学习笔记:字典的使用示例详解
Jun 13 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
批处理与python代码混合编程的方法
May 19 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
python绘制多个曲线的折线图
Mar 23 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
python实现的自动发送消息功能详解
Aug 15 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
Python基于类路径字符串获取静态属性
Mar 12 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 高手之路(三)
2006/10/09 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Numpy之文件存取的示例代码
2018/08/03 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
python中re模块知识点总结
2021/01/17 Python
行政管理人员精品工作推荐信
2013/11/04 职场文书
集体婚礼证婚词
2014/01/13 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
社区灵活就业证明
2014/11/03 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
Docker官方工具docker-registry案例演示
2022/04/13 Servers
Python OpenGL基本配置方式
2022/05/20 Python