caffe与tensorflow框架下卷积的维度计算与一致性证明
??對于卷積運算,假設輸入維度為iii,卷積核的維度為www,步長為sss,這里為了敘述方便僅描述一維且忽略pad(pad可以看做已經乘以2加到輸入維度中去了)。在caffe框架下,按照平移的原則一步步算卷積,如果最后還剩下若干個不夠卷積核大小的數,則直接被拋棄,因此卷積的輸出維度為:
out = ?i?ws?\lfloor\frac{i-w}{s}\rfloor?si?w??+1
??而在tensorflow中卷積的運算與padding的設置有關,這里順便提一下tensorflow中padding=same和valid對應的計算方法。padding=valid時,其計算方法和caffe一樣,也是從頭開始卷積,卷到最右邊或者最下邊時有多余的不夠一個卷積核大小的多余數據時直接扔掉。之前看一些博客中寫到,此時輸出維度的計算方法為:
out = ?i?w+1s?\lceil{\frac{i-w+1}{s}\rceil}?si?w+1??
上面兩個式子是相等的,只是兩種不同的寫法而已,這里簡單給個證明。
?i?ws?\lfloor\frac{i-w}{s}\rfloor?si?w??+1 = ?i?w+1s?\lceil{\frac{i-w+1}{s}\rceil}?si?w+1??
分以下幾種情況:
2.1:當i?ws\frac{i-w}{s}si?w?為整數時,即i?ws\frac{i-w}{s}si?w?=aaa。i?w+1s{\frac{i-w+1}{s}}si?w+1?=a+1s∈(a,a+1)??i?w+1s?a+\frac{1}{s}\in(a,a+1)\Rightarrow\lceil{\frac{i-w+1}{s}\rceil}a+s1?∈(a,a+1)??si?w+1??=a+1a+1a+1,等式兩邊均為a+1a+1a+1,等式成立。
2.2:當i?ws\frac{i-w}{s}si?w?不為整數時,即i?ws\frac{i-w}{s}si?w?=a+mna+\frac{m}{n}a+nm?,其中mn\frac{m}{n}nm?為不可約的真分數。
~對于等式左邊,由于m,nm,nm,n均為正整數,所以有m+1≤nm+1\le{n}m+1≤n,則等式左邊的值為a+1a+1a+1。
~對于等式右邊,顯然有?i?w+1s?=?a+mn+1s?≥a+1\lceil{\frac{i-w+1}{s}\rceil}=\lceil{a+\frac{m}{n}+\frac{1}{s}\rceil}\ge{a+1}?si?w+1??=?a+nm?+s1??≥a+1。欲證等式成立,僅需證明
?i?w+1s?=?a+mn+1s?≤a+1\lceil{\frac{i-w+1}{s}\rceil}=\lceil{a+\frac{m}{n}+\frac{1}{s}\rceil}\le{a+1}?si?w+1??=?a+nm?+s1??≤a+1。僅需證明mn+1s≤1\frac{m}{n}+\frac{1}{s}\le{1}nm?+s1?≤1。
i?ws\frac{i-w}{s}si?w?=a+mn=as+s′s=a+s′s?mn=s′sa+\frac{m}{n}=\frac{as+s'}{s}=a+\frac{s'}{s}\Rightarrow\frac{m}{n}=\frac{s'}{s}a+nm?=sas+s′?=a+ss′??nm?=ss′?,由于mn\frac{m}{n}nm?為不可約分數,而s′s\frac{s'}{s}ss′?卻不一定是不可約的,有s′=km,s=kns'=km,s=kns′=km,s=kn,其中kkk為正整數,最小為1,即s=kn≥ns=kn\ge{n}s=kn≥n。
則mn+1s≤mn+1n=m+1n≤1(m+1≤n)\frac{m}{n}+\frac{1}{s}\le{\frac{m}{n}+\frac{1}{n}}=\frac{m+1}{n}\le{1}(m+1\le{n})nm?+s1?≤nm?+n1?=nm+1?≤1(m+1≤n),即證明了?i?w+1s?≥a+1\lceil{\frac{i-w+1}{s}\rceil}\ge{a+1}?si?w+1??≥a+1和?i?w+1s?≤a+1\lceil{\frac{i-w+1}{s}\rceil}\le{a+1}?si?w+1??≤a+1,則?i?w+1s?=a+1\lceil{\frac{i-w+1}{s}\rceil}={a+1}?si?w+1??=a+1,等式成立。
結論:caffe的卷積維度和tensorflow的padding=valid時的conv2d維度計算方法是一樣的。而當padding=same時,輸出的維度
out = ?is?\lceil{\frac{i}{s}}\rceil?si??
當輸入的維度不夠湊足運算所需要的數值時,會自動做zero-padding,需要注意的是,zero-padding時是按照左右或上下對稱的方式進行的,當出現奇數時,右邊或者下邊會多padding出一行或一列。另外,tensorflow也提供了padding的函數,用戶可以顯式的手動去選擇在哪里做多少padding,然后再結合conv2d中的valid或same參數,就可以實現任意輸出維度的卷積了。
??caffe里面的pooling層維度計算和convolution不完全一樣.pooling層輸出的維度中,當最后還剩下幾個數據不夠一個kernel的大小時,convolution的做法是拋棄這些數據,相當于向下取整.而pooling層有一個round_mode可以設置是向上取整還是向下取整,默認是向上取整的.如果pooling中的round_mode設置為向下取整,那多余的那些數據依然被拋棄;如果設置為向上取整,在最后一次kernel對應的pooling運算中,還剩下幾個數據,就從那幾個數據中按照pooling的方式(max?average?min?)去算結果.比如max_pooling的kernel_size是3,可是最后只剩下2個數了且round_mode設置為CEIL,那就從剩下的兩個數里選max作為pooling結果.emmmm,感覺caffe還是比較粗糙啊,難怪很多model從caffe轉到tensorflow之后inference結果都有或多或少的差別…
總結
以上是生活随笔為你收集整理的caffe与tensorflow框架下卷积的维度计算与一致性证明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阐述Linux动态库的显式调用
- 下一篇: STM32----摸石头过河系列(四)