什么是卷積?
TensorFlow中的卷積可以算在高級圖像處理部分。主要目的是對信號進行變換處理,得到特征。卷積也可以叫濾波(filter),在整個特征處理中,位置如下圖。
圖1特征處理
卷積的作用就是求特征,具體應用例如傳統的雙邊濾波進行磨皮到深度學習進行人臉識別等都是的。這里我們講一下具體卷積的計算方法。
圖2 卷積的作用圖
圖3 手工卷積核的效果圖(銳化)
注:傳統關於圖像處理,是為了通過某個點周圍的環境對這個點的影響而獲得的特征(也就是卷積核),因而出現了銳化(減少環境的影響)和模糊(增加周圍的影響)。
而在深度學習中,關於卷積核也是采用數學公式求得周圍環境對某個點的影響,進而求特征,識別人臉等。因此,卷積核相關的一個名詞叫視野域(field-of-view)即考慮多少周圍的環境,如何參照周圍的環境,進而從這方面考慮可以得出Atrous卷積。因為一個圖片某個點周圍的環境是不確定的,那么周圍環境的對這個點的共享程度是多少,我們無法確定,因而一般一視同仁,即很常見,卷積核是一個對稱矩陣,這個時候卷積就蛻化成了互相關 cross-correlation。(現在大部分的深度學習教程中都把卷積定義為圖像矩陣和卷積核的按位點乘。實際上,這種操作亦應該是互相關,而卷積需要把卷積核順時針旋轉180度然后再做點乘。)
卷積的計算方法:
1.TensorFlow中的Toeplitz matrix做卷積就是矩陣相乘,也就是GeMM。
2.利用傅里葉變換
第一種方法(即把卷積轉化為矩陣乘法,GeMM):
我們這里以一張圖片為例,假設輸入一張圖片(單通道)他的矩陣shape(4,4,1);卷積核設kernel=(3,3),步長為1.padding方式為VALID。(這樣特征圖大小保持不變)
TensorFlow卷積是
1、把(4,4,1 )reshape為(9,4)的矩陣。(效果如下圖)
2、卷積核filter reshape為(1,9)
3、采取矩陣相乘的方法:(1,9)*(9,4)=(1,4)得到卷積后的特征圖像,然后reshape為(2,2)即可。
圖4 圖片reshape
因為計算機一次性讀取相近的內存是最快的,尤其是當需要把數據送到GPU去計算的時候,這樣可以節省訪存的時間,以達到加速的目的。不同框架的訪存機制不一樣,所以會有行列相反這樣的區別。我們可以從tf.nn.con2d的data_format=NHWC,可以側面猜測TensorFlow底層采用的是im2col的方法優化卷積運算(同caffe),因為NHWC的方式進行矩陣相乘訪存命中率高於NCWH的方式,這樣可以提高卷積的計算速度。參考PPT最后幾頁。
另外,根據這個方法,DCGAN把上面的矩陣乘法轉置,則可以得到轉置卷積,也叫反卷積。
第二種方法(利用傅里葉變換):
簡而言之即一句話 時域卷積,頻域相乘。
1、利用快速傅里葉變換把圖片和卷積核變換到頻域;
2、頻域把兩者相乘
3、把結果利用傅里葉逆變換得到特征圖
這種方法更多使用於信號檢測等方面,因為信號具有天然的屬性——時間。這是圖像所有沒的,如果硬要和信號對應的應該是視頻和音頻吧。
所以在CV中常用的方法是第一種方法,時間復雜度和空間復雜度都低。
另外卷積其實就是為沖激函數誕生的。“沖激函數”是狄拉克為了解決一些瞬間作用的物理現象而提出的符號。古人曰:“說一堆大道理不如舉一個好例子”,沖量這一物理現象很能說明“沖激函數”。在t時間內對一物體作用F的力,倘若作用時間t很小,作用力F很大,但讓Ft的乘積不變,即沖量不變。於是在用t做橫坐標、F做縱坐標的坐標系中,就如同一個面積不變的長方形,底邊被擠的窄窄的,高度被擠的高高的,在數學中它可以被擠到無限高,但即使它無限瘦、無限高、但它仍然保持面積不變(它沒有被擠沒!),為了證實它的存在,可以對它進行積分,積分就是求面積嘛!於是“卷積”這個數學怪物就這樣誕生了。傅里葉變換也是為這個概念的最原始的方法。
結論:在數字圖像處理上,卷積更多的可以認為是互相關,而不必使用復雜的傅里葉變換,而信號處理方面,既然要對頻域進行分析,則可以在頻域計算卷積結果。
參考:
卷積(convolution)和互相關(cross-correlation):https://blog.csdn.net/u013498583/article/details/79481144
圖2:https://www.jianshu.com/p/abb7d9b82e2a(如有侵權,請聯系刪除)
TensorFlow的卷積層C++源碼(筆者其實沒看):https://github.com/tensorflow/tensorflow/blob/9590c4c32dd4346ea5c35673336f5912c6072bf2/third_party/eigen3/unsupported/Eigen/CXX11/src/NeuralNetworks/SpatialConvolutions.h
WIKI:https://en.wikipedia.org/wiki/Toeplitz_matrix#Discrete_convolution
im2col的原理和實現(圖4):https://blog.csdn.net/dwyane12138/article/details/78449898
DCGAN-深度卷積生成對抗網絡-轉置卷積:https://blog.csdn.net/weixin_39059031/article/details/81303734
推薦閱讀:
語義分割——Deeplab:https://www.cnblogs.com/SsoZhNO-1/p/10962267.html
卷積與傅里葉變換:https://blog.csdn.net/Augusdi/article/details/12438011?utm_source=blogxgwz2
卷積網絡加速:https://blog.csdn.net/shuzfan/article/details/70172346?utm_source=blogxgwz0
通用矩陣乘(GEMM)優化與卷積計算:https://zhuanlan.zhihu.com/p/66958390