python中的卷積

2021-10-22 11:30:01 字數 4289 閱讀 3649

兩個n維陣列的卷積,兩個陣列的維度必須相同!!!

scipy.signal.convolve(input1, input2, mode=『full』, method=『auto』)引數介紹:

input1:第乙個陣列

input2:第二個陣列

mode:有三個模式( 『full』, 『valid』, 『same』)可選,輸出大小與此引數有關。

method:有三個模式 (『auto』,『direct』,『fft』),可選,指用於計算卷積的方法。

(1)direct:卷積是直接從總和(卷積的定義)中確定的。

(2)fft:傅利葉變換用於通過呼叫進行卷積。

(3)auto:根據估計更快的速度自動選擇直接或傅利葉方法(預設)

1. 例子1(一維):

import scipy.signal

input1 =[1

,2,3

,4,6

,8]input2 =

[0.1

,0.4

,0.5

]result1 = scipy.signal.convolve(input1, input2)

result2 = scipy.signal.convolve(input1, input2, mode=

'same'

)result3 = scipy.signal.convolve(input1, input2, mode=

'valid'

)print

(result1)

print

(result2)

print

(result3)

結果:

[

0.10.6

1.62.6

3.75.2

6.24.]

[0.6

1.62.6

3.75.2

6.2]

[1.6

2.63.7

5.2]

具體運算細節:(數字訊號處理,離散訊號的卷積)

首先input2翻轉』,即[0.5 , 0.4, 0.1]

(1)預設 mode = 『full』,有零填充

第乙個元素:0.5 x 0 + 0.4 x 0 + 0.1 x 1 = 0.1

第二個元素:0.5 x 0 + 0.4 x 1 + 0.1 x 2 = 0.6

…第七個元素:0.5 x 6 + 0.4 x 8 + 0.1 x 0 = 6.2

第八個元素:0.5 x 8 +0.4 x 0 + 0.1 x 0 = 4

(2)mode = 『same』,輸出與input1相同,在 mode = 『full』 結果的中心

(3)mode = 『valid』 ,無零填充,result每個元素都是 input1 和 input2 中的元素相乘再相加得來的,即result中每個元素都是有效的。

2. 例子2(二維):

input1 =[[

1,2,

3],[

4,4,

7],[

8,9,

0]]input2 =[[

0.1,

0.4],[

0.3,

0.2]

]

輸入:

第一步:對卷積核進行旋轉

第二步:計算卷積

(1)mode = 『full』: 輸出是輸入的完整離散線性卷積,有零填充。(預設)

第乙個元素 output[0][0] :0.2 x 0 + 0.3 x 0 + 0.4 x 0 + 0.1 x 1 = 0.1

第二個元素 output[0][1] :0.2 x 0 + 0.3 x 0 + 0.4 x 1 + 0.1 x 2 = 0.6

第三個元素 output[0][2] :0.2 x 0 + 0.3 x 0 + 0.4 x 2 + 0.1 x 3 = 1.1

第四個元素 output[0][3] :0.2 x 0 + 0.3 x 0 + 0.4 x 0.3 + 0.1 x 0 = 1.2

第五個元素 output[1][0] :0.2 x 0 + 0.3 x 1 + 0.4 x 0 + 0.1 x 4 = 0.7

第六個元素 output[1][1] :0.2 x 1 + 0.3 x 2 + 0.4 x 4 + 0.1 x 4 = 2.8……

最終結果

這個結果就是 mode = 『full』 的結果。

(2)mode = 『valid』: 輸出僅包含不依賴零填充的那些元素。在「valid」模式下,input1或input2 在每個維度上都必須至少與另乙個一樣大。

output[0][0] :0.2 x 1 + 0.3 x 2 + 0.4 x 4 + 0.1 x 4 = 2.8

output[0][1] :0.2 x 2 + 0.3 x 3 + 0.4 x 4 + 0.1 x 7 = 3.6

output[1][0] :0.2 x 4 + 0.3 x 4 + 0.4 x 8 + 0.1 x 9 = 6.1

output[1][1] :0.2 x 4 + 0.3 x 7 + 0.4 x 9 + 0.1 x 0 = 6.5

最終結果

(3)mode = 『same』: 輸出與input1相同,在 mode = 『full』 結果的中心(本例子在 4x4 矩陣中,故中心結果如下)。

最終結果

只能計算兩個一維序列的離散線性卷積

numpy.convolve(input1, input2, mode=『full』)引數介紹:

input1:第乙個陣列(一維,shape為(n, )

input2:第二個陣列(一維,shape為(m, )

mode:有三個模式( 『full』, 『valid』, 『same』),同上!

(1)『full』 : 輸出的 shape 為 ( n + m - 1 , )

(2)『same』: 輸出的長度為 max( m , n )

(3)『valid』: 輸出的長度為 max( m , n ) - min( m , n ) + 1.

例子:

input1 =[1

,2,3

,4,6

,8]input2 =

[0.1

,0.4

,0.5

]result1 = np.convolve(input1, input2)

result2 = np.convolve(input1, input2, mode=

'same'

)result3 = np.convolve(input1, input2, mode=

'valid'

)print

(result1)

print

(result2)

print

(result3)

結果(與上個小節中的例子一相同):

[

0.10.6

1.62.6

3.75.2

6.24.]

[0.6

1.62.6

3.75.2

6.2]

[1.6

2.63.7

5.2]

卷積中的引數

卷積引數 引數,filter多少,卷積核大小 32 32 3 5 5 3卷積後,得到 28 28 1 計算公式 32 5 1,若使用6個filter 那麼就是得到28 28 6個輸出 即 加上bias後,5 5 3 6 6 456個引數 卷積後的大小計算 關鍵引數 步長,卷積核大小 n f stri...

caffe中的卷積

如上,將三維的操作轉換到二維上面去做,然後呼叫gemm庫進行矩陣間的運算得到最後結果。兩個矩陣相乘,需要中間的那個維度相同,這個相同的維度就是c k k,其中c是feature map的維度,k為卷積核的邊長。按照卷積核在feature map上面滑窗的順序將其展開成二維的。在三維上面看,就是卷積核...

深入理解卷積網路中的 「卷積」

你可以把卷積想象成一種混合資訊的手段。想象一下裝滿資訊的兩個桶,我們把它們倒入乙個桶中並且通過某種規則攪拌攪拌。也就是說卷積是一種混合兩種資訊的流程 卷積過程是基於乙個小矩陣,也就是卷積核,在上面所說的每層畫素矩陣上不斷按步長掃過去的,掃到數與卷積核對應位置的數相乘,然後求總和,每掃一次,得到乙個值...