日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Conv1D和Conv2D的区别

發(fā)布時間:2023/11/28 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Conv1D和Conv2D的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我的答案是,在Conv2D輸入通道為1的情況下,二者是沒有區(qū)別或者說是可以相互轉(zhuǎn)化的。首先,二者調(diào)用的最后的代碼都是后端代碼(以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)
區(qū)別在于input和filter傳遞的參數(shù)不同,input不必說,filter=kernel是什么呢?

我們進(jìn)入Conv1D和Conv2D的源代碼看一下。他們的代碼位于layers/convolutional.py里面,二者繼承的都是基類_Conv(Layer)。進(jìn)入_Conv類查看代碼可以發(fā)覺以下代碼:

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)
我們假設(shè),Conv1D的input的大小是(600,300),而Conv2D的input大小是(m,n,1),二者kernel_size為3。

進(jìn)入conv_utils.normalize_tuple函數(shù)可以看到:

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的實際大小,根據(jù)rank進(jìn)行計算,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數(shù)目我們假設(shè)二者都是64個卷積核。因此,Conv1D的kernel的shape實際為:

(3,300,64)

而Conv2D的kernel的shape實際為:

(3,3,1,64)

剛才我們假設(shè)的是傳參的時候kernel_size=3,如果,我們將傳參Conv2D時使用的的kernel_size設(shè)置為自己的元組例如(3,300),那么傳根據(jù)conv_utils.normalize_tuple函數(shù),最后的kernel_size會返回我們自己設(shè)置的元組,也即(3,300)那么Conv2D的實際shape是:

(3,300,1,64),也即這個時候的Conv1D的大小reshape一下得到,二者等價。

換句話說,Conv1D(kernel_size=3)實際就是Conv2D(kernel_size=(3,300)),當(dāng)然必須把輸入也reshape成(600,300,1),即可在多行上進(jìn)行Conv2D卷積。

這也可以解釋,為什么在Keras中使用Conv1D可以進(jìn)行自然語言處理,因為在自然語言處理中,我們假設(shè)一個序列是600個單詞,每個單詞的詞向量是300維,那么一個序列輸入到網(wǎng)絡(luò)中就是(600,300),當(dāng)我使用Conv1D進(jìn)行卷積的時候,實際上就完成了直接在序列上的卷積,卷積的時候?qū)嶋H是以(3,300)進(jìn)行卷積,又因為每一行都是一個詞向量,因此使用Conv1D(kernel_size=3)也就相當(dāng)于使用神經(jīng)網(wǎng)絡(luò)進(jìn)行了n_gram=3的特征提取了。這也是為什么使用卷積神經(jīng)網(wǎng)絡(luò)處理文本會非常快速有效的內(nèi)涵。
---------------------
作者:哈哈進(jìn)步
來源:CSDN
原文:https://blog.csdn.net/hahajinbu/article/details/79535172
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的Conv1D和Conv2D的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。