**自知乎:卷積神經網路的複雜度分析
之前的inception學習部落格:
『tensorflow』讀書筆記_inception_v3_上
『tensorflow』讀書筆記_inception_v3_下
即模型的運算次數,可用flops衡量,也就是浮點運算次數(floating-point operations)。
time~o(m2·k2·cin·cout)
m:輸出特徵圖邊長
k:卷積核尺寸
c:通道數目
輸出邊長m計算公式為:
m = (x - k + 2*padding)//stride + 1
下圖展示了單個cout的上單個點的計算示意,需要重複計算:cout·每張輸出特徵圖上畫素數次。
l表示層編號,實質就是對各個層求和。
卷積層實現可以很好的看清實現機理:out層、out長寬、in層迴圈,迴圈體內k2級別運算:
def conv2d(img, kernel):空間複雜度(訪存量),嚴格來講包括兩部分:總參數量 + 各層輸出特徵圖。height, width, in_channels = img.shape
kernel_height, kernel_width, in_channels, out_channels = kernel.shape
out_height = height - kernel_height + 1
out_width = width - kernel_width + 1
feature_maps = np.zeros(shape=(out_height, out_width, out_channels))
for oc in range(out_channels): # iterate out_channels (# of kernels)
for h in range(out_height): # iterate out_height
for w in range(out_width): # iterate out_width
for ic in range(in_channels): # iterate in_channels
patch = img[h: h + kernel_height, w: w + kernel_width, ic]
feature_maps[h, w, oc] += np.sum(patch * kernel[:, :, ic, oc])
return feature_maps
space~o(∑k2·cl-1·cl + ∑m2·cl)
m:輸出特徵圖邊長
k:卷積核尺寸
c:通道數目
時間複雜度決定了模型的訓練/**時間。如果複雜度過高,則會導致模型訓練和**耗費大量時間,既無法快速的驗證想法和改善模型,也無法做到快速的**。
空間複雜度決定了模型的引數數量。由於維度詛咒的限制,模型的引數越多,訓練模型所需的資料量就越大,而現實生活中的資料集通常不會太大,這會導致模型的訓練更容易過擬合。
當我們需要裁剪模型時,由於卷積核的空間尺寸通常已經很小(3x3),而網路的深度又與模型的表徵能力緊密相關,不宜過多削減,因此模型裁剪通常最先下手的地方就是通道數。
inceptionv1 借鑑了 network in network 的思想,在乙個 inception module 中構造了四個並行的不同尺寸的卷積/池化模組(上圖左),有效的提公升了網路的寬度。但是這麼做也造成了網路的時間和空間複雜度的激增。對策就是新增 1 x 1 卷積(上圖右紅色模組)將輸入通道數先降到乙個較低的值,再進行真正的卷積。
在3*3卷積分支上加入64個1*1卷積前後的時間複雜度對比如下式:
同理,在5*5卷積分支上加入64個1*1卷積前後的時間複雜度對比如下式:
整個層的參數量變化如下:
全連線層複雜度分析:x*x的輸入flatten為x2的輸入,輸出神經元個數可以視為1*1*cout,則:
time~o(12·x2·cin·cout)
space~o(x2·cin·cout + x2·cin) ~ o(x2·cin·cout)
空間複雜度第一部分為權重引數,第二部分為當前輸入大小。順便一提我之前的乙個誤區:全連線層相對卷積層其運算瓶頸不在時間複雜度,而在空間複雜度,我之前的印象裡把兩者混為一談了。
使用gap後,首先將cin·x2的輸入轉化為cin,然後1*1卷積為cout:
time~o(cin·cout)
space~o(cin·cout + cin)~ o(cin·cout)
space來說可能有點問題:cin·x2的原輸入應該還是要儲存的,不過由於不涉及到卷積運算,姑且不細究。
但是注意:gap會影響收斂速度,不過並不會影響最終的精度。
兩個3*3卷積聯級的感受野與單個5*5卷積相當,計算公式可見『計算機視覺』感受野和anchor
,替換後時間複雜度卻可降低:
inceptionv3 中提出了卷積的 factorization,在確保感受野不變的前提下進一步簡化,複雜度的改善同理可得,不再贅述。
xception 中每個輸入通道只會被對應的乙個卷積核掃瞄,降低了模型的冗餘度。對於深度可分離卷積depthwise separable 是乙個 depthwise conv 加乙個 pointwise conv,其中 depthwise 是m2·k2·cin,pointwise 是m2·cin·cout,即:
time~o(m2·k2·cin + m2·cin·cout)
機器學習基礎 VC維與模型複雜度 樣本複雜度
上一小節,我們引入了vc維的概念,用它來描述假設集合的表達能力。這一小節中,我們將從vc維的物理意義出發,進一步學習如何根據vc維傳達的資訊來選擇模型和假設集合。如果我們將假設集合的數量 h 比作假設集合的自由度,那麼vc維就是假設集合在做二元分類的有效的自由度,即這個假設空間能夠產生多少dicho...
機器學習基礎 VC維與模型複雜度 樣本複雜度
上一小節,我們引入了vc維的概念,用它來描述假設集合的表達能力。這一小節中,我們將從vc維的物理意義出發,進一步學習如何根據vc維傳達的資訊來選擇模型和假設集合。如果我們將假設集合的數量 h 比作假設集合的自由度,那麼vc維就是假設集合在做二元分類的有效的自由度,即這個假設空間能夠產生多少dicho...
如何衡量演算法時間複雜度,空間複雜度以及大O表示法
演算法是用來解決特定的問題的一種思想,對於同乙個問題,可以有多種實現方式,最終的結果是一樣的,但是整個過程需要的時間和資源不同,我們就需要在時間和空間上進行衡量。時間複雜度 當前演算法所需要的執行時間 空間複雜度 當前演算法所需要的記憶體空間 大 o 表示法 也叫做漸進式時間複雜度,公式為 t n ...