如有错误,欢迎斧正。

我的答案是,在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.# Argumentsvalue: The value to validate and convert. Could an int, or any iterableof 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.# ReturnsA tuple of n integers.# RaisesValueError: If something else than an int/long or iterable thereof waspassed."""if isinstance(value, int):return (value,) * nelse: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的特征提取了。这也是为什么使用卷积神经网络处理文本会非常快速有效的内涵。

Keras中Conv1D和Conv2D的区别相关推荐

  1. Conv1D和Conv2D的区别

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

  2. python模型保存save_浅谈keras保存模型中的save()和save_weights()区别

    今天做了一个关于keras保存模型的实验,希望有助于大家了解keras保存模型的区别. 我们知道keras的模型一般保存为后缀名为h5的文件,比如final_model.h5.同样是h5文件用save ...

  3. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  4. keras:Convolution2D与Conv2D

    关系 总体区别:Convolution2D = Conv2D 参考来源:源文件 github.keras.layder.convolutional # Aliases Convolution1D = ...

  5. conv2d的输入_神经网络-Conv1D和Conv2D实现

    今天我们对比Conv1D和Conv2D实现文本卷积,提前说明两种方式实现的运算是一样的. 两种实现方式的原理图对比 输入数据的形状对比 Conv1D (batch, steps, channels), ...

  6. Tensorflow 2.x(keras)源码详解之第七章:keras中的tf.keras.layers

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  7. 深度学习布料交换:在Keras中实现条件类比GAN

    2017年10月26日SHAOANLU 条件类比GAN:交换人物形象的时尚文章(链接) 给定三个输入图像:人穿着布A,独立布A和独立布B,条件类比GAN(CAGAN)生成穿着布B的人类图像.参见下图. ...

  8. 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 南巴黎电信学院(Télécom SudParis)的在读博士生Nathan Hubens在训练CNN时遇到点难题. 使用在CIFAR10数据 ...

  9. python内核大小_关于keras.layers.Conv1D的kernel_size参数使用介绍

    今天在用keras添加卷积层的时候,发现了kernel_size这个参数不知怎么理解,keras中文文档是这样描述的: kernel_size: 一个整数,或者单个整数表示的元组或列表, 指明 1D ...

最新文章

  1. linux 错误 ttyname failed: Inappropriate ioctl for device 解决方法
  2. python详细安装教程3.7.4-python 3.7.4 安装 opencv的教程
  3. 使用hyper-v、CentOS学习Linux基本概念和命令
  4. Linux中的DRM、DRI、DMA 介绍
  5. 智能运维监管系统终端_智能运维系列(十三)| 面向智能化运维的CMDB系统构建...
  6. 如何检查数组是否包含JavaScript中的对象?
  7. [hihoCoder 1384]Genius ACM
  8. ubuntu php7.0 redis,ubuntu 搭建php7 redis
  9. python中try语句_[转]python 里面 try语句
  10. 30轧制过程的计算机控制系统,中厚板轧制过程计算机控制系统结构的研制(1)
  11. IDEA 控制台显示Run Dashboard
  12. 【JavaScript 封装库】BETA 1.0 测试版发布!
  13. 在vs2005中遇到的调试问题以及解决办法
  14. AI之语音转写项目实践
  15. Linux各个文件夹的作用
  16. 华师在线计算机基础试题及答案,华师在线计算机基础试题的答案.doc
  17. python中空字符串是什么_python为空怎么表示 python如何判断字符串为空
  18. android光标Cursor
  19. UML2.51边译边学-接口
  20. Redis的攻击手法

热门文章

  1. matlab中axis square与axis equal区别
  2. linux内核工程导论,Linux内核工程导论–网络:TCP:netlink与tcp_diag编程
  3. Doris系列之导入Kafka数据操作
  4. 输入一个字符串,将字符串中的大写字母改成小写字母,小写字母不变,其他字符忽略,然后输出转换之后的结果。
  5. Host文件的使用与说明
  6. Java并发编程面试题(2022最新版)
  7. 程序员的算法课(6)-最长公共子序列(LCS)
  8. MY SQL 数据库升级
  9. 记getsockopt有时偶然返回为零的异常
  10. 计算机三级考试网络技术——速成