conv1d和conv2d的区别

六六 TOP1 495

conv1d和conv2d的区别是:1.应用场景;2. keras中的参数对比;3. 计算过程。在Conv2D输入通道为1的情况下,二者是没有区别或者说是可以相互转化的。

一、区别

1.应用场景

我们都知道,图像的数据一般是三维的 [公式] ,文本的数据一般是二维的 [公式]

[公式] 代表图像的通道数, [公式] 代表词向量的维度。这么一看,图像中每个像素点向量和文本中词向量是对应的。

2. keras中的参数对比

kernel_size:卷积核的尺寸

在Conv2D中,是一个二维的元组 [公式] ,当然也可以传入整数,代表 [公式] ;

在Conv2D中,是整数 [公式] 。

strides:步长

3.计算过程

Conv2D

输入为 [公式] 的图片,卷积核的尺寸为 [公式] ,卷积核个数为2,所以

参数总数[公式] 。

多出来的3为图片的channel,每个卷积核会自动扩充到3维,对应每个通道。

Conv1D

输入有两个序列,第一个序列为 [公式] 的文本,卷积核的尺寸为 2,卷积核个数为1,所以

参数总数[公式] 。

多出来的3为文本的词向量维度,卷积核会自动扩充到2维,对应每个隐维度。

二、举例

首先,二者调用的最后的代码都是后端代码(以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)


最后,推荐我们的管理工具给大家。

回复

我来回复
  • 暂无回复内容

联系我们
关注微信
关注微信
分享本页
返回顶部