日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习总结——CS231n课程深度学习(机器视觉相关)笔记整理

發布時間:2025/3/20 pytorch 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习总结——CS231n课程深度学习(机器视觉相关)笔记整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度學習筆記整理

  • 說明
  • 基本知識點一:模型的設置(基本)
    • 1. 激活函數的設置
    • 2. 損失函數的設置
      • (1) 分類問題
      • (2) 屬性問題
      • (3) 回歸問題
    • 3. 正則化方式的設置
      • (1) 損失函數添加正則化項
      • (2) 最大范式約束
      • (3) 隨機失活
    • 4. 參數更新方式
      • (1) 梯度下降的更新方式
    • (2) 學習率的更新方式
  • 基本知識點二:模型的訓練(基本)
    • 1. 訓練之前
      • (1) 數據預處理
      • (2) 權重初始化
      • (3) 合理性檢查
    • 2. 訓練之中
      • (1) 梯度檢查
      • (2)檢查整個學習過程
  • 基本知識點三:卷積神經網絡
    • 1. 卷積層
    • 2. 匯聚層
    • 3. 歸一化層
    • 4. 全連接層
  • 基本知識點四:循環神經網絡
    • 1. RNN結構
    • 2. RNN基礎
    • 3. RNN變種:LSTM
  • 基本知識點五:經典深度學習框架
    • 1. 圖像分類(Classification)——卷積神經網絡(CNN)
      • (1) AlexNex
      • (2) VGG
      • (3) GoogLeNet
      • (4) ResNet
    • 2. 圖像檢測(Detection)——區域卷積神經網絡(R-CNN)
      • (1) R-CNN
      • (2) SPP-Net
      • (3) Fast R-CNN
      • (4) Faster R-CNN
      • (5) YOLO
      • (6) SSD
      • (7) R-FCN
    • 3. 圖像分割(Segmentation)——全卷積神經網絡(FCN)
      • (1) FCN
      • (2) SegNet
      • (3) DeepLab
  • 相關問題
  • 總結

說明

本文主要是筆者在學習CS231n課程之后結合一些博客文章對相關知識點進行了一個總結,僅僅相當于一個知識框圖,如果文中出現任何錯誤歡迎大家指正。
首先推薦一下CS231n的課程及其中文筆記賀完結!CS231n官方筆記授權翻譯總集篇發布,本文大部分內容是參考此筆記進行總結,詳細的內容還是請大家參考原文。



基本知識點一:模型的設置(基本)

1. 激活函數的設置

  • Sigmoid函數:有輸出飽和(會使梯度消失)同時輸出不是零中心(會導致梯度下降出現z字型)
  • Tan函數:輸出是零中心,但是仍會有輸出飽和
  • ReLU函數:其優勢是不會有飽和且計算量小,但是比較脆弱容易死掉(梯度將0),不過可以通過降低學習率來減少死掉的情況
  • Leaky ReLU函數:減少上述死掉情況,但效果不穩定
  • 2. 損失函數的設置

    不管是簡單的線性分類器模型,還是復雜的深度學習網絡模型,模型最先的出來的都是一個score矩陣,通過score矩陣帶入損失函數才求得當前的損失,損失用來衡量我們對結果的不滿意程度,根據損失值再進行反向傳播。根據問題的不同有不同的損失函數:

    (1) 分類問題

  • SVM損失函數:其最后的效果是使得模型在正確分類上的得分比不正確的分類上的得分高處一個邊界值Δ\DeltaΔ,其損失函數又成為折頁損失(Ridge損失),公式如下
    Li=∑j?=yimax(0,fj?fyi+1)\displaystyle L_i=\sum_{j\not=y_i}max(0,f_j-f_{y_i}+1)Li?=j??=yi??max(0,fj??fyi??+1)

  • Softmax損失函數:其輸入值是一個 score向量,輸出也是一個向量,其中每個元素在0~1之間,且所有元素和為1。其損失為交叉熵損失,公式如下:
    Li=?log(efyi∑jefj)\displaystyle Li=-log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}})Li=?log(j?efj?efyi???)
    以上兩者區別如下:

  • (2) 屬性問題

    所謂屬性問題就是每個樣本不僅僅只有一個標簽,而是具有多個屬性,解決方法是

  • 為每個屬性創建一個獨立的二分類的分類器。例如,針對每個分類的二分類器會采用下面的公式:
    Li=∑jmax(0,1?yijfj)\displaystyle L_i=\sum_jmax(0,1-y_{ij}f_j)Li?=j?max(0,1?yij?fj?)
  • 對每種屬性訓練一個獨立的邏輯回歸分類器。例如, 二分類的邏輯回歸分類器只有兩個分類(0,1),其中對于分類1的概率計算為:
    P(y=1∣x;w,b)=11+e?(wTx+b)=σ(wTx+b)\displaystyle P(y=1|x;w,b)=\frac{1}{1+e^{-(w^Tx+b)}}=\sigma(w^Tx+b)P(y=1x;w,b)=1+e?(wTx+b)1?=σ(wTx+b)
    對與某一樣笨計算出來的概率大于0.5即該樣本屬于分類1。
  • (3) 回歸問題

    所謂回歸問題就是直接預測出值的問題,例如長度、數量,而不僅僅是一個定性標簽的問題。

  • L2范式
    Li=∣∣f?yi∣∣22L_i=||f-y_i||^2_2Li?=f?yi?22?
  • L1范式
    Li=∣∣f?yi∣∣1=∑j∣fj?(yi)j∣L_i=||f-y_i||_1=\sum_j|f_j-(y_i)_j|Li?=f?yi?1?=j?fj??(yi?)j?
  • 當面對一個回歸任務,首先考慮是不是必須這樣。一般而言,盡量把你的輸出變成二分類,然后對它們進行分類,從而變成一個分類問題。

    3. 正則化方式的設置

    (1) 損失函數添加正則化項

    L2正則化實現:對于網絡中的每個權重www,向目標函數中增加一個12λw2\frac{1}{2}\lambda w^221?λw2,其中λ\lambdaλ是正則化強度。作用:L2正則化可以直觀理解為它對于大數值的權重向量進行嚴厲懲罰,傾向于更加分散的權重向量。這樣就有了一個優良的特性:使網絡更傾向于使用所有輸入特征,而不是嚴重依賴輸入特征中某些小部分特征。
    L1正則化實現:對于每個www我們都向目標函數增加一個λ∣w∣\lambda|w|λw作用:L1正則化會讓權重向量在最優化的過程中變得稀疏(即非常接近0)。也就是說,使用L1正則化的神經元最后使用的是它們最重要的輸入數據的稀疏子集。

    (2) 最大范式約束

    給每個神經元中權重向量的量級設定上限,并使用投影梯度下降來確保這一約束。在實踐中,與之對應的是參數更新方式不變,然后要求神經元中的權重向量w→\overrightarrow{w}w必須滿足∣∣w→∣∣2&lt;c||\overrightarrow{w}||_2&lt;cw2?<c

    (3) 隨機失活

    在訓練的時候,隨機失活的實現方法是讓神經元以超參數p的概率被激活或者被設置為0,在predict函數中不進行隨機失活,但是對于兩個隱層的輸出都要乘以p,調整其數值范圍。因為我們想要神經元的輸出與訓練時的預期輸出是一致的。

    4. 參數更新方式

    (1) 梯度下降的更新方式

    這里突然自己想補充一點,在深度學習中,一般是采用一階的梯度下降法直接進行梯度下降,而在視覺SLAM里的非線性優化中通常采用高斯牛頓或列文博格的方法,都不采用二階的牛頓法的原因是Hessen矩陣計算量過大。

  • 普通更新
  • x += - learning_rate * dx
  • 動量更新
  • v = mu * v - learning_rate * dx # 與速度融合 x += v # 與位置融合
  • Nesterov動量更新
  • v_prev = v # 存儲備份 v = mu * v - learning_rate * dx # 速度更新保持不變 x += -mu * v_prev + (1 + mu) * v # 位置更新變了形式

    動量更新Nestrerov動量更新的區別:既然我們知道動量將會把我們帶到綠色箭頭指向的點,我們就不要在原點(紅色點)那里計算梯度了。使用Nesterov動量,我們就在這個“向前看”的地方計算梯度。

    (2) 學習率的更新方式

    如果學習率很高,系統的動能就過大,參數向量就會無規律地跳動,不能夠穩定到損失函數更深更窄的部分去,因此需要進行學習率退火

  • 隨步數衰減:每進行幾個周期就根據一些因素降低學習率
  • 指數衰減:數學公式是α=α0e?kt\alpha=\alpha_0e^{-kt}α=α0?e?kt,其中α0,k\alpha_0,kα0?,k是超參數,ttt是迭代次數(也可以使用周期作為單位)
  • 1/t衰減:數學公式是α=α0/(1+kt)\alpha=\alpha_0/(1+kt)α=α0?/(1+kt),其中α0,k\alpha_0,kα0?,k是超參數,ttt是迭代次數。
  • 然后還有一部分方式是逐參數適應學習率的方法,就學習率會和梯度變化的大小有關:

  • Adagrad
  • cache += dx**2 x += - learning_rate * dx / (np.sqrt(cache) + eps)
  • RMSprop
  • cache = decay_rate * cache + (1 - decay_rate) * dx**2 x += - learning_rate * dx / (np.sqrt(cache) + eps)
  • Adam
  • m = beta1*m + (1-beta1)*dx v = beta2*v + (1-beta2)*(dx**2) x += - learning_rate * m / (np.sqrt(v) + eps)

    基本知識點二:模型的訓練(基本)

    1. 訓練之前

    (1) 數據預處理

  • 均值減法:對數據中每個獨立特征減去平均值,從幾何上可以理解為在每個維度上都將數據云的中心都遷移到原點。如果先計算整個數據集圖像的平均值然后每張圖片都減去平均值,最后將整個數據集分成訓練/驗證/測試集,那么這個做法是錯誤的。應該怎么做呢?應該先分成訓練/驗證/測試集,只是從訓練集中求圖片平均值,然后各個集(訓練/驗證/測試集)中的圖像再減去這個平均值
  • 歸一化:將數據的所有維度都歸一化,使其數值范圍都近似相等。第一種是先對數據做零中心化處理,然后每個維度都除以其標準差,第二種是對每個維度都做歸一化,使得每個維度的最大和最小值是1和-1。
  • PCA和白化PCA操作是先對數據進行零中心化處理,然后計算協方差矩陣,對數據協方差矩陣進行SVD(奇異值分解)運算,將已經零中心化處理過的原始數據投影到特征基準上。白化操作的輸入是特征基準上的數據,然后對每個維度除以其特征值來對數值范圍進行歸一化。該變換的幾何解釋是:如果數據服從多變量的高斯分布,那么經過白化后,數據的分布將會是一個均值為零,且協方差相等的矩陣。
  • (2) 權重初始化

  • 小隨機數初始化:不能用全為零的權值進行初始化,因為如果網絡中的每個神經元都計算出同樣的輸出,然后它們就會在反向傳播中計算出同樣的梯度,從而進行同樣的參數更新。換句話說,如果權重被初始化為同樣的值,神經元之間就失去了不對稱性的源頭。
  • 使用1/sqrt(n)校準方差:隨著輸入數據量的增長,隨機初始化的神經元的輸出數據的分布中的方差也在增大。我們可以除以輸入數據量的平方根來調整其數值范圍,這樣神經元輸出的方差就歸一化到1
  • 稀疏初始化:權重矩陣設為0,但是為了打破對稱性,每個神經元都同下一層固定數目的神經元隨機連接(其權重數值由一個小的高斯分布生成)
  • 偏置通常初始化為0

    (3) 合理性檢查

  • 尋找特定情況的正確損失值,即在使用小參數進行初始化時,確保得到的損失值與期望一致。最好先單獨檢查數據損失(讓正則化強度為0)
  • 提高正則化強度時導致損失值變大
  • 對小數據子集過擬合,在整個數據集進行訓練之前,嘗試在一個很小的數據集上進行訓練(比如20個數據),然后確保能到達0的損失值
  • 2. 訓練之中

    (1) 梯度檢查

    即比較解析梯度和數值梯度的誤差,數值梯度速度蠻,但是結果穩定;解析梯度速度快,結果精確但是不穩定,我們通常用解析梯度作為梯度下降的輸入,而數值梯度對其進行梯度檢查,有一下幾點注意

  • 數值梯度使用中心化公式
  • 使用相對誤差來比較
  • 使用雙精度進行梯度檢查,如果使用單進度可能會導致梯度實現正確,但相對誤差也會很高
  • 目標函數不可導點導致不準確,解決不可導點問題的辦法是使用少量數據點,因此在計算數值梯度時,使用少量數據點可以使檢查更高效
  • 謹慎設置步長
  • 開始梯度下降時再進行梯度檢查,一次迭代就進行梯度檢查,此時可能正處在不正常的邊界情況
  • 不要讓正則化吞沒數據,先關掉正則化對數據損失做單獨檢查,然后對正則化做單獨檢查
  • 關閉隨機失活和數據擴張
  • 檢查少量維度,梯度可以有上百萬的參數,在這種情況下只能檢查其中一些維度然后假設其他維度是正確的
  • (2)檢查整個學習過程

  • 損失函數,即它在前向傳播時對每個獨立的批數據進行計

    x軸通常都是表示周期(epochs)單位,該單位衡量了在訓練中每個樣本數據都被觀察過次數的期望(一個周期意味著每個樣本數據都被觀察過了一次)。相較于迭代次數(iterations),一般更傾向跟蹤周期,這是因為迭代次數與數據的批尺寸(batchsize)有關,而批尺寸的設置又可以是任意的。損失值的震蕩程度和批尺寸(batch size)有關,當批尺寸為1,震蕩會相對較大。

  • 訓練集和驗證集的準確率,在訓練集準確率和驗證集準確率中間的空隙指明了模型過擬合的程度。

  • 權重更新比例,即權重中更新值的數量和全部值的數量之間的比例,一個經驗性的結論是這個比例應該在1e-3左右。如果更低,說明學習率可能太小,如果更高,說明學習率可能太高。



  • 基本知識點三:卷積神經網絡

    1. 卷積層

    即每個神經元與輸入數據的一個局部區域連接,該連接的空間大小叫做神經元的感受野(receptive field),一共有三個超參數:深度(depth),步長(stride)和零填充(zero-padding)。輸出數據體在空間上的尺寸可以通過輸入數據體尺寸(WWW),卷積層中神經元的感受野尺寸(FFF),步長(SSS)和零填充的數量(PPP)的函數來計算Size=(W?F+2P)/S+1Size = (W-F+2P)/S+1Size=(W?F+2P)/S+1同一個深度上的卷積核是權重共享的,在反向傳播的時候,都要計算每個神經元對它的權重的梯度,但是需要把同一個深度上的所有神經元對權重的梯度累加,這樣就得到了對共享權重的梯度。而輸入圖片是中心結構時,需要放松參數共享的限制,將層稱為局部連接層(Locally-Connected Layer)

    2. 匯聚層

    作用是逐漸降低數據體的空間尺寸,其輸入數據體尺寸(WWW),超參數為尺寸(FFF),步長(SSS),則Size=(W?F)/S+1Size = (W-F)/S+1Size=(W?F)/S+1反向傳播可以簡單理解為將梯度只沿最大的數回傳。因此,在向前傳播經過匯聚層的時候,通常會把池中最大元素的索引記錄下來

    3. 歸一化層

    解決Internal Covariate Shift問題(由于輸入分布的不斷變化,導致上層網絡需要不斷調整去適應,導致網絡學習速率低,容易陷入梯度飽和區域,減緩網絡收斂速度),可以通過PCA和白化解決,但是計算成本太高公式如下:Z[l]=W[l]A[l?1]+b[l]Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}Z[l]=W[l]A[l?1]+b[l]μ=1m∑i=1mZ[l](i)\mu=\frac{1}{m}\sum_{i=1}^mZ^{[l](i)}μ=m1?i=1m?Z[l](i)σ2=1m∑i=1m(Z[l](i)?μ)2\sigma^2=\frac{1}{m}\sum_{i=1}^m(Z^{[l](i)}-\mu)^2σ2=m1?i=1m?(Z[l](i)?μ)2Z~[l]=γ?Z[l]?μσ2+?+β\tilde{Z}^{[l]}=\gamma\cdot\frac{Z^{[l]}-\mu}{\sqrt{\sigma^2+\epsilon}}+\betaZ~[l]=γ?σ2+??Z[l]?μ?+βA[l]=g[l](Z~[l])A^{[l]}=g^{[l]}(\tilde{Z}^{[l]})A[l]=g[l](Z~[l])參數γ,β\gamma,\betaγ,β的引入是為了恢復數據本身的表達能力,對規范化后的數據進行線性變換,需要學習。其效果是(1)BN使得網絡中每層輸入數據的分布相對穩定,加速模型學習速度;(2)BN使得模型對網絡中的參數不那么敏感,簡化調參過程,使得網絡學習更加穩定;(3)BN允許網絡使用飽和性激活函數(例如sigmoid,tanh等),緩解梯度消失問題;(4)BN具有一定的正則化效果

    4. 全連接層

    起到推理器和分類器的效果,可以將全連接層轉化為卷積層



    基本知識點四:循環神經網絡

    1. RNN結構


    一對一的結構通常沒什么用,一對多可以用來輸入一個圖片,輸出一句描述圖片的話,多對一可以輸入一句話,判斷是正面還是負面情緒,**多對多(延時)**可以用來機器翻譯,多對多輸入一個視頻,判斷每幀分類

    2. RNN基礎


    如上圖所示,其前向傳播公式為:ht=fW(ht?1,xt)h_t=f_W(h_{t-1},x_t)ht?=fW?(ht?1?,xt?)
    這里值得注意的是,每一步用的都是同一個函數以及同樣的參數,上式展開得:ht=tanh(Whhht?1+Wxhxt+b)h_t=tanh(W_{hh}h_{t-1}+W_{xh}x_t+b)ht?=tanh(Whh?ht?1?+Wxh?xt?+b)yt=Softmax(Wohht+c)y_t = Softmax(W_{oh}h_t+c)yt?=Softmax(Woh?ht?+c)相較于普通的神經網絡其實就是多加上了ht?1h_{t-1}ht?1?
    損失函數Lt(yt,yt^)=?ytlog(yt^)L_t(y_t,\hat{y_t})=-y_tlog(\hat{y_t})Lt?(yt?,yt?^?)=?yt?log(yt?^?)L(yt,yt^)=?∑tytlog(yt^)L(y_t,\hat{y_t}) = -\sum_{t}^{}y_tlog(\hat{y_t})L(yt?,yt?^?)=?t?yt?log(yt?^?)反向求導公式需要求損失函數Lt(yt,yt^)L_t(y_t,\hat{y_t})Lt?(yt?,yt?^?)Whh,Wxh,WohW_{hh},W_{xh},W_{oh}Whh?,Wxh?,Woh?的倒數,然后按照梯度下降法進行下降,推導過程可以參考循環神經網絡RNN 梯度推導(BPTT)

    3. RNN變種:LSTM

    RNN 前后依賴的特性導致兩個輸入距離比較遠的時候作用會非常弱,同時會有梯度消失或梯度爆炸的問題,一個解決方案就是設計 Gate,保存重要記憶,這就是LSTM所謂 Gate 的結構就是一個使用 Sigmoid 神經網絡和一個 Elementwise Multiplication 的操作,這兩個操作合在一起就是一個門的結構,Sigmoid 作為激活函數的全連接神經網絡層會輸出一個 0-1 之間的數值,描述當前輸入有多少信息量可以通過這個結構,類似于門,門打開時(Sigmoid 輸出為1時),全部信息都可以通過;當門關上時(Sigmoid 輸出為0),任何信息都無法通過。

    其步驟如下(參考遞歸神經網絡 RNN 筆記)
    (1)新輸入 xtx_txt? 和前狀態 ht?1h_{t?1}ht?1? 通過 Sigmoid 變換決定 ct?1c_{t?1}ct?1? 的哪些信息可以舍棄,ftf_tft?Ct?1C_{t?1}Ct?1? 做 Elementwise Multiplication 運算,對部分信息進行去除
    (2)新輸入 xtx_txt? 前狀態 ht?1h_{t?1}ht?1? 通過 Sigmoid 變換告訴 ctc_tct? 哪些新信息想要保存,通過 tanhtanhtanh 變換建一個新的侯選值向量。iti_tit?: 新信息添加時的系數(對比 ftf_tft?),gtg_tgt? 單獨新數據形成的控制參數,用于對 ctc_tct? 進行更新。
    (3)根據舊的控制參數 ct?1,ft,it,gtc_{t?1},f_t,i_t,g_tct?1?,ft?,it?,gt? 組合生成最終生成該時刻最終控制參數
    (4)新輸入 xtx_txt? 和前狀態 ht?1h_{t?1}ht?1? 通過 Sigmoid 變換決定 Cell State 的哪些信息需要輸出,與 Cell State 通過 tanhtanhtanh 變換后的值相乘,產生此刻的新的 LSTM 輸出
    整個過程:CtC_tCt? 信息舍棄 => CtC_tCt? 局部生成 =>CtC_tCt? 更新 =>CtC_tCt? 運算



    基本知識點五:經典深度學習框架

    1. 圖像分類(Classification)——卷積神經網絡(CNN)

    進化史:AlexNet(8) -> VGG(19) -> GoogleNet(22) -> ResNet(152) -> ResNext

    (1) AlexNex

    AlexNet一共8層,它首次提出(1)ReLU非線性激活;(2)Max Pooling池化;(3)Dropout

    (2) VGG

    VGG一共19層,它的貢獻主要是(1)將一個大卷積核分解成連續多個小卷積核(7×7核可以分成3個3×3核),從而減少參數、降低計算、增加深度,下圖是他的結構圖,非常簡潔明了

    (3) GoogLeNet

    GoogLeNet一共有四個版本,其特點是Inception Architecture,提供多尺度特征,輸出通道多尺度化,如下

    Inception V1主要貢獻是:(1)Split-Merge(指上圖結構)增加網絡對多尺度的適應性,增加網絡寬度;(2)Bottleneck Layer,即使用1×1的卷積進行降維,大幅度降低計算量(3)取消全連接;(4)輔助分類器,用來解決梯度消失問題
    Inception V2主要貢獻是:(1)使用Batch Normalization解決Internal Covariate Shift問題,取消部分dropout
    Inception V3主要貢獻是:(1)使用非對稱卷積;(2)采用特殊的池化高效的講尺寸;(3)取消淺層輔助分類器

    (4) ResNet

    ResNet全是3×3的卷積核,通過如下殘差結構解決梯度消失問題,可以多達152層,取消了池化、全連接層、Dropout,然后通過卷積步長取代池化

    2. 圖像檢測(Detection)——區域卷積神經網絡(R-CNN)

    進化史:(第一階段)R-CNN -> SPP-Net -> Fast R-CNN -> Faster R-CNN(第二階段)YOLO -> SSD -> R-FCN

    (1) R-CNN

    傳統方法“Region Proposals + 手工特征 + 分類器”,R-CNN方法為“Selectiv Search + CNN特征 + SVM”,如下圖

    其步驟如下:
    (1)通過Selective Search算法提取2000個Region Proposals(和類別無關但是包含物體的區域),Seletive Search算法相較于滑窗窮舉法計算量要小,大概思路就是通過特征先提取小尺度區域,然后一次次合并得到大的尺寸
    (2)對特征進行CNN的特征提取
    (3)對CNN特征進行SVM的二分類

    (2) SPP-Net

    R-CNN慢是因為Selectiv Search之后進行卷積特征提取,重復計算量太大。SPP-Net所做的改進主要是(1)直接輸入整圖,所有區域共享卷積計算(2)引入空間金字塔池化,為不同尺寸的區域,在Conv5上輸出提取特征映射到尺寸固定的全連接層上
    R-CNN的pipeline是:Image -> Selective Search -> Warp -> Convlution Layer -> Fully Connected layer -> output;
    SPP-Net的pipeline是:Image -> Convlution Layer -> Spatial Pyramid Pooling -> Fully Connected layer -> output;

    (3) Fast R-CNN


    在SPP-Net的基礎上又引入了兩個新技術
    (1)感興趣區域池化層,有效避免了物體的形變扭曲,保證了特征信息的真實性,同時不需要對每個proposal都提取特征,采用映射方式從整張圖片的Feature Map上獲取ROI Feature區域;
    (ROI Pooling時,將輸入的h×wh × wh×w大小的Feature Map分割成H×WH × WH×W大小的子窗口(每個子窗口的大小約為h/H,w/Wh/H,w/Wh/Hw/W,其中H、WH、WHW為超參數,如設定為7 x 7),對每個子窗口進行Max-Pooling操作,得到固定輸出大小的Feature Map。而后進行后續的全連接層操作)
    (2)多任務損失函數。
    Fast R-CNN可以端到端的單階段訓練,所有層的參數都可以Fine Tune。

    (4) Faster R-CNN


    Faster R-CNN其實就是在Fast RCNN的基礎上講Selectiv Search算法替換成Region ProPosal Network(RPN),進一步共享卷積計算
    如上圖左所示,首先根據輸入圖獲得Feature Map,然后傳入到RPN網絡匯總,RPN網絡所做的事情,用固定窗口(3×3)對Feature Map進行滑動掃描,每個窗口對應一個256-d的Intermediater Layer,其輸出是2K2K2K個Score和4K4K4K個Coordinate,其中KKK就是每個窗口對應Anchor Box的數量,2K2K2K是因為RPN只判定某個區域里面是否存在感興趣物體(0,1),它的輸出是一個Score大于0.5的Bounding Box(由Coordinate獲得),然后,在Feature Map上對Bounding Box里的內容進行Classification,同時由于Bounding Box的坐標不準確,因此會進行Bounding Box Regression,這也就是上圖右所示內容

    (5) YOLO

    YOLO的作者在生活中應該是個逗逼,但是他的作品是真的強,YOLO有一個隱藏技能就是它的網絡是用C實現的(darknet),可以直接嵌入到C++框架中,我之后會寫一篇博客講如何調用YOLO網絡

    其實現步驟如下:
    (1)將圖片resize到448×448大小的尺寸,然后講圖片劃分為S×SS×SS×S個Grid(S=7,因此64×64的小圖片就是一個Grid)
    (2)每個Grid負責生成BBB個Bounding Box,每個Bounding Box對應4個Coordinate和1個Confidence(表示表示物體對應的Bounding Box和Ground Truth Box的Intersection of Union(IOU)大小)
    (3)每個grid還要生成CCC個Conditional Class Probabilities(表示該Grid內部包含物體時,這個物體屬于各個類別上的概率)
    (4)因此一張圖片輸出為S×S×(B×5+C)S×S×(B×5+C)S×S×(B×5+C),然后就是找Ground Truth進行訓練。
    因為其是通過Grid進行劃分圖片,假如一個Grid對應多個小物體,則只能輸出一個小物體,因此YOLO對小物體檢測效果不好,YOLOv3通過對網絡結構改進,添加了多尺度預測,解決了上述問題,參考目標檢測網絡之 YOLOv3

    (6) SSD

    參考SSD原理與實現,其主要原理如下圖所示:

    其基本步驟如下:
    (1)類似于Faster R-CNN先從Image通過CNN生成Feature Map,不同的是SSD需要生成不同尺寸的Feature Map
    (2)類似于YOLO,采用3×3的窗口在每個FeatureMap上進行掃描,對應生成BBB個Bounding Box(借鑒了Faster R-CNN中的Anchor Box的原理),每個Bounding Box對應4個Coordinate和CCC個Class Probability
    (3)可以看到對于M×NM×NM×N的feature map,輸出節點數為M×N×K×(C+4)M×N×K×(C+4)M×N×K×(C+4),然后就是找Ground Truth進行訓練
    下圖很好的概括了Faster R-CNN、YOLO、SSD的不同原理

    (7) R-FCN

    R-FCN是在Faster R-CNN的框架上進行了改造,其效果比Faster R-CNN要好,其流程如下:

    其兩點創造性工作是
    (1)把基礎的分類網由VGG換成了ResNet
    (2)R-FCN使用了基于全圖-全卷積-可共享的Postion-Sensitive Score Maps 來處理RPN的映射和ROI的提取,避免Faster R-CNN對每一個Proposal執行ROI Pooling時在FC層進行權重計算消耗的時間

    3. 圖像分割(Segmentation)——全卷積神經網絡(FCN)

    進化史:FCN -> SegNet -> DeepLab
    卷積化:是指所有全連接層轉化為卷積層,使用任意尺寸的輸入,輸出低分辨率的圖片
    反卷積化:是指講低分辨率的圖片進行上采樣,輸出同分辨率的圖片

    (1) FCN

    FCN結構如下:

    其步驟其實就是卷積之后反卷積,這里有兩點需要注意
    (1)反卷積操作:操作的直觀理解如下:

    上左圖就是卷積操作,上右圖就是反卷積操作,在代碼中卷積和反卷積操作其實就是矩陣相乘
    (2)跳躍結構:在結構圖中可以看出來,FCN中加入跳躍結構,是因為直接將全卷積后的結果上采樣后得到的結果通常是很粗糙的,通過跳躍結構來優化輸出

    (2) SegNet

    其結構如下:

    如圖是一個對稱網絡,由中間綠色Pooling層與紅色Upsampling層作為分割,左邊是卷積提取高維特征,并通過Pooling使圖片變小,右邊是反卷積(在這里反卷積與卷積沒有區別)與Upsampling,通過反卷積使得圖像分類后特征得以重現,最后通過Softmax,輸出不同分類的最大值。
    這里值得注意的是Upsampling的操作,在Pooling的時候記錄最大值的位置,Upsampling將其恢復到最大值的最大值的位置,Upsampling后面的反卷積其實就是卷積操作,下圖就展示了SegNet和FCN中Upsampling操作的不同。

    (3) DeepLab

    其核心工作就是進行空洞卷積+CRF作為后處理
    (1)在DCNN中重復最大池化和下采樣帶來的分辨率下降問題,分辨率的下降會丟失細節。DeepLab是采用的atrous(帶孔)算法擴展感受野,獲取更多的上下文信息
    (2)分類器獲取以對象中心的決策是需要空間變換的不變性,這天然的限制了DCNN的定位精度,DeepLab采用完全連接的條件隨機場(DenseCRF)提高模型捕獲細節的能力
    其流程如下:

    相關問題

    這里也是先推薦一下博客BAT機器學習面試1000題系列,之后有時間在搜集相關的問題

    總結

    寫了三篇分別關于視覺SLAM、機器學習和深度學習的總結之后,還是有很多問題知其然不知其所以然,還需要之后在工作研究中慢慢學習總結才行,另外概率論、矩陣和最優化的知識在每個領域里都是有用到的,很多知識是互通的,比如視覺SLAM中的BA優化和深度學習里面的梯度下降其實是一個問題,只是根據各自特點采用了不同的數學解法,能在自己腦子里形成一個知識框架感覺還是很好的,最后就是這幾篇博客可能更多地是用給自己總結,讀者讀起來應該很費力,之后慢慢改善吧,繼續加油咯!

    總結

    以上是生活随笔為你收集整理的深度学习总结——CS231n课程深度学习(机器视觉相关)笔记整理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。