<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          卷積神經(jīng)網(wǎng)絡(luò)的復(fù)雜度分析

          共 4533字,需瀏覽 10分鐘

           ·

          2021-09-05 10:23

          點(diǎn)擊左上方藍(lán)字關(guān)注我們



          一個(gè)專注于目標(biāo)檢測與深度學(xué)習(xí)知識分享的公眾號

          編者薦語
          在梳理CNN經(jīng)典模型的過程中,作者理解到其實(shí)經(jīng)典模型演進(jìn)中的很多創(chuàng)新點(diǎn)都與改善模型計(jì)算復(fù)雜度緊密相關(guān),那本篇文章就讓我們對卷積神經(jīng)網(wǎng)絡(luò)的復(fù)雜度分析簡單總結(jié)一下。
          作者 | Michael Yuan@知乎
          https://zhuanlan.zhihu.com/p/31575074

          1. 時(shí)間復(fù)雜度


          即模型的運(yùn)算次數(shù),可用 FLOPs衡量,也就是浮點(diǎn)運(yùn)算次數(shù)(FLoating-point OPerations)。


          1.1 單個(gè)卷積層的時(shí)間復(fù)雜度

          M: 每個(gè)卷積核輸出特征圖的邊長

          K: 每個(gè)卷積核的邊長

          Cin每個(gè)卷積核的通道數(shù),也即輸入通道數(shù),也即上一層的輸出通道數(shù)。

          Cout本卷積層具有的卷積核個(gè)數(shù),也即輸出通道數(shù)。

          可見,每個(gè)卷積層的時(shí)間復(fù)雜度由輸出特征圖面積M^2、卷積核面積 K^2 、輸入 Cin和輸出通道數(shù) Cout 完全決定。

          其中,輸出特征圖尺寸本身又由輸入矩陣尺寸X、卷積核尺寸 K 、Padding、Stride 這四個(gè)參數(shù)所決定,表示如下:

          注1:為了簡化表達(dá)式中的變量個(gè)數(shù),這里統(tǒng)一假設(shè)輸入和卷積核的形狀都是正方形。

          注2:嚴(yán)格來講每層應(yīng)該還包含 1 個(gè) Bias 參數(shù),這里為了簡潔就省略了。


          1.2 卷積神經(jīng)網(wǎng)絡(luò)整體的時(shí)間復(fù)雜度

          D神經(jīng)網(wǎng)絡(luò)所具有的卷積層數(shù),也即網(wǎng)絡(luò)的深度。

          l神經(jīng)網(wǎng)絡(luò)第 l 個(gè)卷積層

          Cl神經(jīng)網(wǎng)絡(luò)第 Cl 個(gè)卷積層的輸出通道數(shù) Cout ,也即該層的卷積核個(gè)數(shù)。

          對于第 l 個(gè)卷積層而言,其輸入通道數(shù) Cin 就是第 l-1 個(gè)卷積層的輸出通道數(shù)。

          可見,CNN整體的時(shí)間復(fù)雜度并不神秘,只是所有卷積層的時(shí)間復(fù)雜度累加而已。

          簡而言之,層內(nèi)連乘,層間累加。



          示例:用 Numpy 手動(dòng)簡單實(shí)現(xiàn)二維卷積

          假設(shè) Stride = 1, Padding = 0, img 和 kernel 都是 np.ndarray.


          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




          2. 空間復(fù)雜度


          空間復(fù)雜度(訪存量),嚴(yán)格來講包括兩部分:總參數(shù)量 + 各層輸出特征圖。

          • 參數(shù)量:模型所有帶參數(shù)的層的權(quán)重參數(shù)總量(即模型體積,下式第一個(gè)求和表達(dá)式)

          • 特征圖:模型在實(shí)時(shí)運(yùn)行過程中每層所計(jì)算出的輸出特征圖大小(下式第二個(gè)求和表達(dá)式)

          • 總參數(shù)量只與卷積核的尺寸 K 、通道數(shù) C 、層數(shù) D 相關(guān),而與輸入數(shù)據(jù)的大小無關(guān)。

          • 輸出特征圖的空間占用比較容易,就是其空間尺寸 M^2 和通道數(shù) C 的連乘。

          • 注:實(shí)際上有些層(例如 ReLU)其實(shí)是可以通過原位運(yùn)算完成的,此時(shí)就不用統(tǒng)計(jì)輸出特征圖這一項(xiàng)了。


          3. 復(fù)雜度對模型的影響


          時(shí)間復(fù)雜度決定了模型的訓(xùn)練/預(yù)測時(shí)間。如果復(fù)雜度過高,則會(huì)導(dǎo)致模型訓(xùn)練和預(yù)測耗費(fèi)大量時(shí)間,既無法快速的驗(yàn)證想法和改善模型,也無法做到快速的預(yù)測。

          空間復(fù)雜度決定了模型的參數(shù)數(shù)量。由于維度詛咒的限制,模型的參數(shù)越多,訓(xùn)練模型所需的數(shù)據(jù)量就越大,而現(xiàn)實(shí)生活中的數(shù)據(jù)集通常不會(huì)太大,這會(huì)導(dǎo)致模型的訓(xùn)練更容易過擬合。

          當(dāng)我們需要裁剪模型時(shí),由于卷積核的空間尺寸通常已經(jīng)很小(3x3),而網(wǎng)絡(luò)的深度又與模型的表征能力緊密相關(guān),不宜過多削減,因此模型裁剪通常最先下手的地方就是通道數(shù)。


          4. Inception系列模型是如何優(yōu)化復(fù)雜度的


          過五個(gè)小例子說明模型的演進(jìn)過程中是如何優(yōu)化復(fù)雜度的。


          4.1 InceptionV1 中的 1X1 卷積降維同時(shí)優(yōu)化時(shí)間復(fù)雜度和空間復(fù)雜度


          (圖像被壓縮的慘不忍睹...)


          InceptionV1 借鑒了 Network in Network 的思想,在一個(gè) Inception Module 中構(gòu)造了四個(gè)并行的不同尺寸的卷積/池化模塊(上圖左),有效的提升了網(wǎng)絡(luò)的寬度。但是這么做也造成了網(wǎng)絡(luò)的時(shí)間和空間復(fù)雜度的激增。對策就是添加 1 x 1 卷積(上圖右紅色模塊)將輸入通道數(shù)先降到一個(gè)較低的值,再進(jìn)行真正的卷積。

          以 InceptionV1 論文中的 (3b) 模塊為例(可以點(diǎn)擊上圖看超級精美的大圖),輸入尺寸為 28x28x256, 1x1 卷積核 128 個(gè), 3x3 卷積核 192 個(gè), 5x5 卷積核 96 個(gè),卷積核一律采用 Same Padding 確保輸出不改變尺寸。

          在 3x3 卷積分支上加入 64 個(gè) 1x1 卷積前后的時(shí)間復(fù)雜度對比如下式:


          同理,在 5x5 卷積分支上加入 64 個(gè) 1x1 卷積前后的時(shí)間復(fù)雜度對比如下式:


          可見,使用 1x1 卷積降維可以降低時(shí)間復(fù)雜度3倍以上。該層完整的運(yùn)算量可以在論文中查到,為 300 M,即 3x10^8 。

          另一方面,我們同樣可以簡單分析一下這一層參數(shù)量在使用 1 x 1 卷積前后的變化。可以看到,由于 1 x 1 卷積的添加,3 x 3 和 5 x 5 卷積核的參數(shù)量得以降低 4 倍,因此本層的參數(shù)量從 1000 K 降低到 300 K 左右。


          4.2 InceptionV1 中使用GAP代替 Flatten

          全連接層可以視為一種特殊的卷積層,其卷積核尺寸 K 與輸入矩陣尺寸 X 一模一樣。每個(gè)卷積核的輸出特征圖是一個(gè)標(biāo)量點(diǎn),即 M = 1 。復(fù)雜度分析如下:


          可見,與真正的卷積層不同,全連接層的空間復(fù)雜度與輸入數(shù)據(jù)的尺寸密切相關(guān)。因此如果輸入圖像尺寸越大,模型的體積也就會(huì)越大,這顯然是不可接受的。例如早期的VGG系列模型,其 90% 的參數(shù)都耗費(fèi)在全連接層上。

          InceptionV1 中使用的全局平均池化 GAP 改善了這個(gè)問題。由于每個(gè)卷積核輸出的特征圖在經(jīng)過全局平均池化后都會(huì)直接精煉成一個(gè)標(biāo)量點(diǎn),因此全連接層的復(fù)雜度不再與輸入圖像尺寸有關(guān),運(yùn)算量和參數(shù)數(shù)量都得以大規(guī)模削減。復(fù)雜度分析如下:



          4.3 InceptionV2 中使用兩個(gè) 3x3 卷積級聯(lián)替代 5x5 卷積分支


          感受野不變


          根據(jù)上面提到的二維卷積輸入輸出尺寸關(guān)系公式,可知:對于同一個(gè)輸入尺寸,單個(gè) 5x5 卷積的輸出與兩個(gè) 3x3 卷積級聯(lián)輸出的尺寸完全一樣,即感受野相同。


          同樣根據(jù)上面提到的復(fù)雜度分析公式,可知:這種替換能夠非常有效的降低時(shí)間和空間復(fù)雜度。我們可以把辛辛苦苦省出來的這些復(fù)雜度用來提升模型的深度和寬度,使得我們的模型能夠在復(fù)雜度不變的前提下,具有更大的容量,爽爽的。
          同樣以 InceptionV1 里的 (3b) 模塊為例,替換前后的 5x5 卷積分支復(fù)雜度如下:





          4.4 InceptionV3 中使用 1xN 與 Nx1 卷積級聯(lián)替代 NxN 卷積



          InceptionV3 中提出了卷積的 Factorization,在確保感受野不變的前提下進(jìn)一步簡化。

          復(fù)雜度的改善同理可得,不再贅述。



          4.5 Xception 中使用 Depth-wise Separable Convolution


          我們之前討論的都是標(biāo)準(zhǔn)卷積運(yùn)算,每個(gè)卷積核都對輸入的所有通道進(jìn)行卷積。
          Xception 模型挑戰(zhàn)了這個(gè)思維定勢,它讓每個(gè)卷積核只負(fù)責(zé)輸入的某一個(gè)通道,這就是所謂的 Depth-wise Separable Convolution。
          從輸入通道的視角看,標(biāo)準(zhǔn)卷積中每個(gè)輸入通道都會(huì)被所有卷積核蹂躪一遍,而 Xception 中每個(gè)輸入通道只會(huì)被對應(yīng)的一個(gè)卷積核掃描,降低了模型的冗余度。
          標(biāo)準(zhǔn)卷積與可分離卷積的時(shí)間復(fù)雜度對比:可以看到本質(zhì)上是把連乘轉(zhuǎn)化成為相加。





          5. 總結(jié)



          通過上面的推導(dǎo)和經(jīng)典模型的案例分析,我們可以清楚的看到其實(shí)很多創(chuàng)新點(diǎn)都是圍繞模型復(fù)雜度的優(yōu)化展開的,其基本邏輯就是乘變加。模型的優(yōu)化換來了更少的運(yùn)算次數(shù)和更少的參數(shù)數(shù)量,一方面促使我們能夠構(gòu)建更輕更快的模型(例如MobileNet),一方面促使我們能夠構(gòu)建更深更寬的網(wǎng)絡(luò)(例如Xception),提升模型的容量,打敗各種大怪獸,歐耶~



          參考論文



          • Convolutional Neural Networks at Constrained Time Cost

          • Going Deeper with Convolutions

          • Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

          • Rethinking the Inception Architecture for Computer Vision

          • Xception: Deep Learning with Depthwise Separable Convolutions


          END



          雙一流大學(xué)研究生團(tuán)隊(duì)創(chuàng)建,專注于目標(biāo)檢測與深度學(xué)習(xí),希望可以將分享變成一種習(xí)慣!

          點(diǎn)贊三連,支持一下吧↓

          瀏覽 123
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲V V| 色天天伊人 | 懂色av懂色av粉嫩av无码 | 中文字幕成人在线视频 | 国产乱╳╳A片 |