我的答案是,在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
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. jquery改变链接移上光标时的颜色实例
  2. spring4.2.3+mybatis+spring-security配置文件
  3. 安卓使用adb命令安装软件
  4. Mac 常用快捷键
  5. JBPM表达业务流程(流程定义语言)
  6. 理论沉淀:RANSAC算法
  7. homework-04 单词方阵
  8. 如何用 PHPMailer 来发送邮件?
  9. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
  10. hdu 5637 BestCoder Round #74 (div.2)
  11. 【POJ 2176】Folding
  12. JavaScript中的classList的使用
  13. 【Rails App】 应用服务器从Passenger切换为Puma, Grape出现线程安全问题
  14. 【SQL 代码】SQL 语句记录(不定时更新)
  15. VS使用Nuget教程详解 Visual studio 安装第三方的组件库
  16. Luogu4630 APIO2018 Duathlon 圆方树、树形DP
  17. 使用linux计划任务自动拉起停止的通达OA服务apache和mysql服务
  18. (转)eclipse 报错 :The method list(String, Object[]) is ambiguous for the type BaseHibernateDao
  19. Android下Notification,样式style,主题theme的功能实现
  20. 【遥感影像】Python GDAL 像素与坐标对应

热门文章

  1. openStack 镜像制作,镜像裁剪一般步骤
  2. Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline(转载)
  3. IDEA Terminal
  4. 实现strcat功能
  5. Kafaka入门篇
  6. [2010国家集训队]Crash的旅游计划
  7. 模拟+贪心 SCU 4445 Right turn
  8. jQuery委托
  9. [转]为革命保护视力 --- 给 Visual Studio 换颜色
  10. CF932C Permutation Cycle