matlab中sconv和conv的区别,基于Keras中Conv1D和Conv2D的区别说明

本文详细探讨了在Conv1D和Conv2D中,当输入通道为1时,两者之间的差异。主要区别在于kernel_shape的计算,Conv1D的kernel_shape为(3, 300, 64),而Conv2D的kernel_shape为(3, 3, 64)。尽管调用的底层代码相同,但参数设置和kernel的形状因维度差异而有所变化。
摘要由CSDN通过智能技术生成

如有错误,欢迎斧正。

我的答案是,在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实际为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值