基于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中取整的几种方法小结
Jan 06 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python读取xlsx文件的实现方法
Jul 04 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
pycharm 关掉syntax检查操作
Jun 09 Python
Python3如何使用tabulate打印数据
Sep 25 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
Python环境搭建过程从安装到Hello World
Feb 05 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
php中使用sftp教程
2015/03/30 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python中几种导入模块的方式总结
2017/04/27 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
详解K-means算法在Python中的实现
2017/12/05 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
对python的文件内注释 help注释方法
2018/05/23 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
Python列表如何更新值
2020/05/27 Python
个人自荐书
2013/12/20 职场文书
化学教育专业自荐信
2014/07/04 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
上课不认真检讨书
2014/09/17 职场文书
大学生个人学习总结
2015/02/15 职场文书
班主任经验交流心得体会
2015/11/02 职场文书