我的答案是,在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的特征提取了。这也是为什么使用卷积神经网络处理文本会非常快速有效的内涵。
---------------------
作者:哈哈进步
来源:CSDN
原文:https://blog.csdn.net/hahajinbu/article/details/79535172
版权声明:本文为博主原创文章,转载请附上博文链接!

Conv1D和Conv2D的区别相关推荐

  1. Keras中Conv1D和Conv2D的区别

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

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

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

  3. union和union all有什么区别_Pytorch中Linear与Conv1d(kernel=1)的区别

    191214 说明: 很抱歉,突然发现图中第三行多画了一列叉,事实上,生成 output(0,0) 数据只用到了input[:,0] 以及 weights[0,:].比较懒,就不再画了,图中第三行的第 ...

  4. Pytorch中的Conv1d()和Conv2d()函数

    文章目录 一.Pytorch中的Conv1d()函数 二.Pytorch中的Conv2d()函数 三.Pytorch中的MaxPool1d()函数 四.pytorch中的MaxPool2d()函数 参 ...

  5. tf.nn.conv2d 与tf.layers.conv2d的区别

    1. tf.nn.conv2d tf.nn.conv2d(input, # 张量输入filter, # 卷积核参数strides, # 步长参数padding, # 卷积方式use_cudnn_on_ ...

  6. tf.nn.conv2d和tf.contrib.slim.conv2d的区别

    转自:http://blog.sina.com.cn/s/blog_6ca0f5eb0102wsuu.html 文中摘要: " 在上述的API中,可以看出去除掉初始化的部分,那么两者并没有什 ...

  7. TensorFlow学习——tf.nn.conv2d和tf.contrib.slim.conv2d的区别

    在查看代码的时候,看到有代码用到卷积层是tf.nn.conv2d,也有的使用的卷积层是tf.contrib.slim.conv2d,这两个函数调用的卷积层是否一致,在查看了API的文档,以及slim. ...

  8. Py-博客学习50问

    1.time.time()/clock() https://www.cnblogs.com/bettermanlu/archive/2011/09/19/2181529.html 前者挂钟时间,后者处 ...

  9. TextCNN文本分类实现(主要是CNN模型的使用)

    前言:项目基于CNN模型,对输入问题进行训练,让机器可以识别出问题的类别从而通过相应类别查询所要寻找的数据 有关于数据部分的链接:https://pan.baidu.com/s/16ZR6LVVLP- ...

最新文章

  1. MIT | 一种可解释的PPI预测模型
  2. 百度:这次在AI领域我要做领头羊
  3. 回滚 - 每天5分钟玩转 Docker 容器技术(141)
  4. 数据仓库设计方案(转载)
  5. 文本标点英文对齐_电脑健盘中的所有英文组合意思超值解释建议收藏
  6. java获取一个目录下所有字谜_Java 猜字谜游戏 - osc_4jkldo6l的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. echarts中x轴文件消失_实测实例:labview中波形图X轴刻度任意刻度设置
  8. java异步判断数据库是否有重复字段值
  9. python覆盖数据库重复数据_如何在数据库中插入唯一数据/处理重复数据
  10. Handler机制的理解与使用
  11. linux postgresql 创建数据库,第 23 课 PostgreSQL 创建自己的数据库、模式、用户
  12. Oracle coherence介绍
  13. 【华为机试真题 Python实现】平安果
  14. 利用微信JSSDK调用微信扫一扫功能
  15. Altium designer--LM317/LM337封装图
  16. office启动出现oxc0000142的问题的解决方案
  17. 基于PHP的餐饮行业管理系统
  18. 视频剪辑软件调研(Corel VideoStudio 2018、爱剪辑、微剪辑)
  19. Tex(文档排版工具)
  20. html和css制作的网页设计期末大作业【小米购物商城网站制作】

热门文章

  1. 2022-2028年中国廉价航空行业深度调研及投资前景预测报告
  2. 2022-2028年中国乳制品行业市场需求预测与投资战略规划分析报告
  3. 数据结构(07)— 线性顺序表基本操作
  4. 关于python中的dict和defaultdict
  5. docker通过镜像方式安装tomcat
  6. LeetCode简单题之数组序号转换
  7. LeetCode简单题之按键持续时间最长的键
  8. 微调BERT:序列级和令牌级应用程序
  9. python 把集合转成字典的方法
  10. The expression cannot be a selector(occur after a dot)下面是 what went wrong: Execution failed for task