兩個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上面滑窗的順序將其展開成二維的。在三維上面看,就是卷積核...
深入理解卷積網路中的 「卷積」
你可以把卷積想象成一種混合資訊的手段。想象一下裝滿資訊的兩個桶,我們把它們倒入乙個桶中並且通過某種規則攪拌攪拌。也就是說卷積是一種混合兩種資訊的流程 卷積過程是基於乙個小矩陣,也就是卷積核,在上面所說的每層畫素矩陣上不斷按步長掃過去的,掃到數與卷積核對應位置的數相乘,然後求總和,每掃一次,得到乙個值...