深度學習面試知識小結

參考了一部分別人的,自己也整理了一點,持續更新中…
計算機視覺算法崗面試題:在這裏

CNN結構特點

1.局部連接使網絡可以提取數據的局部特徵
2.首先權值共享就是濾波器共享,即是用相同的濾波器去掃一遍圖像,提取一次特徵,得到feature map。在卷積網絡中,學好了一個濾波器,就相當於掌握了一種特徵,這個濾波器在圖像中滑動,進行特徵提取,然後所有進行這樣操作的區域都會被採集到這種特徵,權值共享大大降低了網絡的訓練難度,一個濾波器只提取一個特徵,在整個圖片(或者語音/文本) 中進行卷積。
3.池化操作與多層次結構一起,實現了數據的降維,
4.多層次結構將低層次的局部特徵組合成爲較高層次的特徵,從而對整個圖片進行表示。

神經網絡中權值共享的理解?

權值(權重)共享這個詞是由LeNet5模型提出來的。以CNN爲例,在對一張圖偏進行卷積的過程中,使用的是同一個卷積核的參數。 比如一個3×3×1的卷積核,這個卷積核內9個的參數被整張圖共享,而不會因爲圖像內位置的不同而改變卷積核內的權係數。說的再直白一些,就是用一個卷積核不改變其內權係數的情況下卷積處理整張圖片(當然CNN中每一層不會只有一個卷積核的,這樣說只是爲了方便解釋而已)。

激活函數的作用

激活函數實現去線性化。神經元的結構的輸出爲所有輸入的加權和,這導致神經網絡是一個線性模型。如果將每一個神經元(也就是神經網絡的節點)的輸出通過一個非線性函數,那麼整個神經網絡的模型也就不再是線性的了,這個非線性函數就是激活函數。 常見的激活函數有:ReLU函數、sigmoid函數、tanh函數。

卷積層和池化層有什麼區別

卷積層有參數,池化層沒有參數
經過卷積層節點矩陣深度會改變,池化層不會改變節點矩陣的深度,但是它可以縮小節點矩陣的大小

卷積層參數數量計算方法

假設輸入層矩陣維度是96963,第一層卷積層使用尺寸爲5x5、深度爲16的過濾器(卷積核尺寸爲5x5、卷積核數量爲16),那麼這層卷積層的參數個數爲553*16+16=1216個

神經網絡爲什麼用交叉熵損失函數

判斷一個輸出向量和期望的向量有多接近,交叉熵(cross entroy)是常用的評判方法之一。交叉熵刻畫了兩個概率分佈之間的距離,是分類問題中使用比較廣泛的一種損失函數。 給定兩個概率分佈p和q,通過q來表示p的交叉熵公式爲: H(p,q)=−∑p(x)logq(x)

什麼樣的數據集不適合深度學習

1.數據集太小,數據樣本不足時,深度學習相對其它機器學習算法,沒有明顯優勢。
2.數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單詞組合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習算法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。

什麼是梯度消失和爆炸,怎麼解決?

神經網絡的訓練中,通過改變神經元的權重,使網絡的輸出值儘可能逼近標籤以降低誤差值,訓練普遍使用BP算法,核心思想是,計算出輸出與標籤間的損失函數值,然後計算其相對於每個神經元的梯度,進行權值的迭代。深度神經網絡中的梯度不穩定性,根本原因在於前面層上的梯度是來自於後面層上梯度的乘積。當存在過多的層次時,就出現了內在本質上的不穩定場景。
梯度消失:前面的層比後面的層梯度變化更小,造成梯度消失的一個原因是,許多激活函數將輸出值擠壓在很小的區間內,如sigmoid函數最大的梯度值爲0.25,而在無窮大時梯度接近爲0,經過多個激活函數後很難再繼續梯度下降,造成學習停止。
梯度爆炸:前面層比後面層梯度變化更快,造成模型無法收斂,故引起梯度爆炸問題。

解決梯度消失和梯度爆炸問題,常用的有以下幾個方案:
1.預訓練模型 + 微調。
2.梯度剪切 + 正則化。
3.relu、leakyrelu、prelu等激活函數。
4.BN批歸一化。
5.殘差結構。
7.選用合適的學習率。

Overfitting怎麼解決

首先所謂過擬合,指的是一個模型過於複雜之後,它可以很好地“記憶”每一個訓練數據中隨機噪音的部分而忘記了去“訓練”數據中的通用趨勢。 過擬合具體表現在:模型在訓練數據上損失函數較小,預測準確率較高;但是在測試數據上損失函數比較大,預測準確率較低。

Parameter Norm Penalties(參數範數懲罰);Dataset Augmentation (數據集增強);Early Stopping(提前終止);Parameter Tying and Parameter Sharing (參數綁定與參數共享);Bagging and Other Ensemble Methods(Bagging 和其他集成方法);dropout;regularization; batch normalizatin。是解決Overfitting的常用手段。

L1和L2區別

L1 範數(L1 norm)是指向量中各個元素絕對值之和,也有個美稱叫“稀疏規則算子”(Lasso regularization)。 比如 向量 A=[1,-1,3], 那麼 A 的 L1 範數爲 |1|+|-1|+|3|。簡單總結一下就是:
L1 範數: 爲 x 向量各個元素絕對值之和,L1 範數可以使權值稀疏,方便特徵提取。
L2 範數: 爲 x 向量各個元素平方和的 1/2 次方, L2 範數可以防止過擬合,提升模型的泛化能力。
Lp 範數: 爲 x 向量各個元素絕對值 p 次方和的 1/p 次方. 在支持向量機學習過程中,L1 範數實際是一種對於成本函數求解最優的過程,因此,L1 範數正則化通過向成本函數中添加 L1 範數,使得學習得到的結果滿足稀疏化,從而方便人類提取特徵。

有哪些常見的損失函數

  1. L1 loss:絕對差平均損失,又稱MAE
    .在這裏插入圖片描述
    2.L2 loss:平方差平均損失,又稱MSE
    在這裏插入圖片描述
    3.Smooth L1 loss,又稱Huber損失
    在這裏插入圖片描述
    4.BCE loss,二分類用的交叉熵損失,用的時候需要在該層前面加上 Sigmoid 函數
    在這裏插入圖片描述
    5.BCEWithlogitsLoss,將sigmoid函數集成到BCE loss上
    6.CrossEntoryLoss,交叉熵損失函數
    第一種形式:
    在這裏插入圖片描述
    第二種形式:
    在這裏插入圖片描述
    softmax的交叉熵:
    在這裏插入圖片描述
    在這裏插入圖片描述
    7.NllLoss:負對數似然損失。

爲什麼sigmoid使用交叉熵而不使用平方差損失

在這裏插入圖片描述
在這裏插入圖片描述

什麼是正則化,爲什麼用正則化?

正則化是爲了防止過擬合, 進而增強泛化能力。
1.L2 正則化公式非常簡單,在原來的損失函數基礎上加上權重參數的平方和其中,Ein 是未包含正則化項的訓練樣本誤差,λ 是正則化參數:
在這裏插入圖片描述
在這裏插入圖片描述
如上圖所示,藍色橢圓區域是最小化 Ein 區域,紅色圓圈是 w 的限定條件區域。在沒有限定條件的情況下,一般使用梯度下降算法,在藍色橢圓區域內會一直沿着 w 梯度的反方向前進,直到找到全局最優值 wlin。例如空間中有一點 w(圖中紫色點),此時 w 會沿着 -∇Ein 的方向移動,如圖中藍色箭頭所示。但是,由於存在限定條件,w 不能離開紅色圓形區域,最多隻能位於圓上邊緣位置,沿着切線方向。w 的方向如圖中紅色箭頭所示。
在這裏插入圖片描述
根據最優化算法的思想:梯度爲 0 的時候,函數取得最優值,構造新的損失函數。
在這裏插入圖片描述
在這裏插入圖片描述
2.L1 正則化公式也很簡單,直接在原來的損失函數基礎上加上權重參數的絕對值
在這裏插入圖片描述
在這裏插入圖片描述
L1正則化比L2正則化更具有稀疏性。
在這裏插入圖片描述

TensorFlow計算圖

Tensorflow 是一個通過計算圖的形式來表述計算的編程系統,計算圖也叫數據流圖,可以把計算圖看做是一種有向圖,Tensorflow 中的每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。

BN(批歸一化)的作用

1.中間層神經元激活輸入x從變化不拘一格的正態分佈通過BN操作拉回到了均值爲0,方差爲1的高斯分佈,使用縮放因子γ和移位因子β來執行此操作。這有兩個好處:避免分佈數據偏移;遠離導數飽和區。即解決了反向傳播過程中的梯度問題。
2.取消Local Response Normalization層。 由於使用了一種Normalization,再使用LRN就顯得沒那麼必要了。而且LRN實際上也沒那麼work。
3.移除或使用較低的dropout。 dropout是常用的防止overfitting的方法,而導致overfit的位置往往在數據邊界處,如果初始化權重就已經落在數據內部,overfit現象就可以得到一定的緩解。論文中最後的模型分別使用10%、5%和0%的dropout訓練模型,與之前的40%-50%相比,可以大大提高訓練速度。
4.可以使用更高的學習率。如果每層的scale不一致,實際上每層需要的學習率是不一樣的,同一層不同維度的scale往往也需要不同大小的學習率,通常需要使用最小的那個學習率才能保證損失函數有效下降,Batch Normalization將每層、每維的scale保持一致,那麼我們就可以直接使用較高的學習率進行優化。
5.降低L2權重衰減係數。 還是一樣的問題,邊界處的局部最優往往有幾維的權重(斜率)較大,使用L2衰減可以緩解這一問題,現在用了Batch Normalization,就可以把這個值降低了,論文中降低爲原來的5倍。

什麼時候不適合用批歸一化

1.小批量數據。
2.數據發佈及其不平衡。

RNN循環神經網絡理解

循環神經網絡(recurrent neural network, RNN), 主要應用在語音識別、語言模型、機器翻譯以及時序分析等問題上。 在經典應用中,卷積神經網絡在不同的空間位置共享參數,循環神經網絡是在不同的時間位置共享參數,從而能夠使用有限的參數處理任意長度的序列。 RNN可以看做作是同一神經網絡結構在時間序列上被複制多次的結果,這個被複制多次的結構稱爲循環體,如何設計循環體的網絡結構是RNN解決實際問題的關鍵。 RNN的輸入有兩個部分,一部分爲上一時刻的狀態,另一部分爲當前時刻的輸入樣本。

訓練過程中模型不收斂,是否說明這個模型無效,致模型不收斂的原因有哪些?

不一定。導致模型不收斂的原因有很多種可能,常見的有以下幾種:
1.沒有對數據做歸一化。
2.沒有檢查過你的結果。這裏的結果包括預處理結果和最終的訓練測試結果。
3.忘了做數據預處理。
4.忘了使用正則化。
5.Batch Size設的太大。
6.學習率設的不對。
7.最後一層的激活函數用的不對。
8.網絡存在壞梯度。比如Relu對負值的梯度爲0,反向傳播時,0梯度就是不傳播。
9.參數初始化錯誤。
10.網絡太深。隱藏層神經元數量錯誤。

圖像處理中平滑和銳化操作是什麼?

平滑處理(smoothing)也稱模糊處理(bluring),主要用於消除圖像中的噪聲部分,平滑處理常用的用途是用來減少圖像上的噪點或失真,平滑主要使用圖像濾波。在這裏,我個人認爲可以把圖像平滑和圖像濾波聯繫起來,因爲圖像平滑常用的方法就是圖像濾波器。 在OpenCV3中常用的圖像濾波器有以下幾種:
1.方框濾波——BoxBlur函數
2.均值濾波(鄰域平均濾波)——Blur函數
3.高斯濾波——GaussianBlur函數
4.中值濾波——medianBlur函數
5.雙邊濾波——bilateralFilter函數
圖像銳化操作是爲了突出顯示圖像的邊界和其他細節圖像銳化實現的方法是通過各種算子和濾波器實現的——Canny算子、Sobel算子、Laplacian算子以及Scharr濾波器。

VGG使用2個3*3卷積的優勢在哪裏?

(1). 減少網絡層參數。用兩個3x3卷積比用1個5x5卷積擁有更少的參數量,只有後者的2∗3∗3/15∗5=0.72。但是起到的效果是一樣的,兩個3x3的卷積層串聯相當於一個5x5的卷積層,感受野的大小都是5×5,即1個像素會跟周圍55的像素產生關聯。

(2). 更多的非線性變換。2個3x3卷積層擁有比1個5x5卷積層更多的非線性變換(前者可以使用兩次ReLU激活函數,而後者只有一次),使得卷積神經網絡對特徵的學習能力更強。

paper中給出的相關解釋:三個這樣的層具有7×7的有效感受野。那麼我們獲得了什麼?例如通過使用三個3×3卷積層的堆疊來替換單個7×7層。首先,我們結合了三個非線性修正層,而不是單一的,這使得決策函數更具判別性。其次,我們減少參數的數量:假設三層3×3卷積堆疊的輸入和輸出有C個通道,堆疊卷積層的參數爲3(32C2)=27C2個權重;同時,單個7×7卷積層將需要72C2=49C2個參數,即參數多81%。這可以看作是對7×7卷積濾波器進行正則化,迫使它們通過3×3濾波器(在它們之間注入非線性)進行分解。

Relu比Sigmoid效果好在哪裏?

relu激活函數:
relu函數方程 ReLU 的輸出要麼是 0, 要麼是輸入本身。雖然方程簡單,但實際上效果更好。
1.ReLU函數計算簡單,可以減少很多計算量。反向傳播求誤差梯度時,涉及除法,計算量相對較大,採用ReLU激活函數,可以節省很多計算量;
2.避免梯度消失問題。對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失問題(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失),從而無法完成深層網絡的訓練;
3.可以緩解過擬合問題的發生。Relu會使一部分神經元的輸出爲0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關係,緩解了過擬合問題的發生。

Relu的缺點

假設有一個神經網絡的輸入W遵循某種分佈,對於一組固定的參數(樣本),w的分佈也就是ReLU的輸入的分佈。假設ReLU輸入是一個低方差中心在+0.1的高斯分佈。
在這個場景下:
大多數ReLU的輸入是正數,因此
大多數輸入經過ReLU函數能得到一個正值(ReLU is open),因此
大多數輸入能夠反向傳播通過ReLU得到一個梯度,因此
ReLU的輸入(w)一般都能得到更新通過隨機反向傳播(SGD)
現在,假設在隨機反向傳播的過程中,有一個巨大的梯度經過ReLU,由於ReLU是打開的,將會有一個巨大的梯度傳給輸入(w)。這會引起輸入w巨大的變化,也就是說輸入w的分佈會發生變化,假設輸入w的分佈現在變成了一個低方差的,中心在-0.1高斯分佈。

對fine-tuning(微調模型的理解),爲什麼要修改最後幾層神經網絡權值?

使用預訓練模型的好處,在於利用訓練好的模型權重去做特徵提取,可以節省我們訓練模型和調參的時間。至於爲什麼只微調最後幾層神經網絡權重,是因爲:
1.CNN中更靠近底部的層(定義模型時先添加到模型中的層)編碼的是更加通用的可複用特徵,而更靠近頂部的層(最後添加到模型中的層)編碼的是更專業業化的特徵。微調這些更專業化的特徵更加有用,它更代表了新數據集上的有用特徵。
2.訓練的參數越多,過擬合的風險越大。很多模型擁有超過千萬的參數,在一個不大的數據集上訓練這麼多參數是有過擬合風險的,除非你的數據集像Imagenet那樣大。

什麼是dropout?

dropout可以防止過擬合,dropout簡單來說就是:我們在前向傳播的時候,讓某個神經元的激活值以一定的概率p停止工作,這樣可以使模型的泛化性更強,因爲它不會依賴某些局部的特徵。
以標準神經網絡爲例,正常的流程是:我們首先把輸入數據x通過網絡前向傳播,然後把誤差反向傳播一決定如何更新參數讓網絡進行學習。使用dropout之後,過程變成如下:
1.首先隨機(臨時)刪掉網絡中一半的隱藏神經元,輸入輸出神經元保持不變;
2.然後把輸入x通過修改後的網絡進行前向傳播計算,然後把得到的損失結果通過修改的網絡反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b);
(3). 然後重複這一過程:
恢復被刪掉的神經元,此時被刪除的神經元保持原樣沒有更新w參數,而沒有被刪除的神經元已經有所更新,從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉,同時備份被刪除神經元的參數。

HOG算法原理描述

方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和圖像處理中用來進行物體檢測的特徵描述子。它通過計算和統計圖像局部區域的梯度方向直方圖來構成特徵。在深度學習取得成功之前,Hog特徵結合SVM分類器被廣泛應用於圖像識別中,在行人檢測中獲得了較大的成功。

HOG特徵原理:
HOG的核心思想是所檢測的局部物體外形能夠被光強梯度或邊緣方向的分佈所描述。通過將整幅圖像分割成小的連接區域(稱爲cells),每個cell生成一個方向梯度直方圖或者cell中pixel的邊緣方向,這些直方圖的組合可表示出(所檢測目標的目標)描述子。爲改善準確率,局部直方圖可以通過計算圖像中一個較大區域(稱爲block)的光強作爲measure被對比標準化,然後用這個值(measure)歸一化這個block中的所有cells。這個歸一化過程完成了更好的照射/陰影不變性。 與其他描述子相比,HOG得到的描述子保持了幾何和光學轉化不變性(除非物體方向改變)。因此HOG描述子尤其適合人的檢測。

HOG特徵提取方法就是將一個image:
1.灰度化(將圖像看做一個x,y,z(灰度)的三維圖像)
2.劃分成小cells(2*2)
3.計算每個cell中每個pixel的gradient(即orientation)
4.統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor。

HOG特徵檢測步驟
在這裏插入圖片描述
顏色空間歸一化——–>梯度計算————->梯度方向直方圖———->重疊塊直方圖歸一化———–>HOG特徵。

BN算法,爲什麼要在後面加加伽馬和貝塔,不加可以嗎?

最後的“scale and shift”操作則是爲了讓因訓練所需而“刻意”加入的BN能夠有可能還原最初的輸入。不加也可以。

機器學習

Focal Loss 介紹一下
數據不平衡怎麼辦?
AUC的理解
AUC的計算公式

分類器的ROC曲線和相關指標

在這裏插入圖片描述
準確率(Accuracy):ACC=(TP+TN)/(TP+TN+FP+FN)

mAP是什麼

P:precision即準確率,TP / (TP + FP),分類器認爲是正類並且確實是正類的部分佔所有分類器認爲是正類的比例;
R:recall即召回率,TP / (TP + FN),分類器認爲是正類並且確實是正類的部分佔所有確實是正類的比例;
目標檢測中:
TP: IoU>0.5的檢測框數量(同一Ground Truth只計算一次)
FP: IoU<=0.5的檢測框,或者是檢測到同一個GT的多餘檢測框的數量
FN: 沒有檢測到的GT的數量
PR曲線:以P和R爲縱橫座標的曲線;
AP值:Average Precision平均精確度,爲PR曲線下面積;
mAP:各類AP的平均值;

舉例:
假設,對於Aeroplane類別,我們網絡有以下輸出(BB表示BoundingBox序號,IoU>0.5時GT=1):

BB  | confidence | GT
----------------------
BB1 |  0.9       | 1
----------------------
BB2 |  0.9       | 1
----------------------
BB1 |  0.8       | 1
----------------------
BB3 |  0.7       | 0
----------------------
BB4 |  0.7       | 0
----------------------
BB5 |  0.7       | 1
----------------------
BB6 |  0.7       | 0
----------------------
BB7 |  0.7       | 0
----------------------
BB8 |  0.7       | 1
----------------------
BB9 |  0.7       | 1
----------------------

因此,我們有 TP=5 (BB1, BB2, BB5, BB8, BB9), FP=5 (重複檢測到的BB1也算FP)。除了表裏檢測到的5個GT以外,我們還有2個GT沒被檢測到,因此: FN = 2. 這時我們就可以按照Confidence的順序給出各處的PR值,如下:

rank=1  precision=1.00 and recall=0.14
----------
rank=2  precision=1.00 and recall=0.29
----------
rank=3  precision=0.66 and recall=0.29
----------
rank=4  precision=0.50 and recall=0.29
----------
rank=5  precision=0.40 and recall=0.29
----------
rank=6  precision=0.50 and recall=0.43
----------
rank=7  precision=0.43 and recall=0.43
----------
rank=8  precision=0.38 and recall=0.43
----------
rank=9  precision=0.44 and recall=0.57
----------
rank=10 precision=0.50 and recall=0.71

對於Recall >= 0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,我們選取此時Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。此時Aeroplane類別的 AP = (0.14-0)*1 + (0.29-0.14)*1 + (0.43-0.29)*0.5 + (0.57-0.43)*0.5 + (0.71-0.57)*0.5 + (1-0.71)*0 = 0.5
mAP就是對每一個類別都計算出AP然後再計算AP平均值就好了。

IoU

#RT:RightTop
#LB:LeftBottom
def IOU(rectangle A, rectangleB):
    W = min(A.RT.x, B.RT.x) - max(A.LB.x, B.LB.x)
    H = min(A.RT.y, B.RT.y) - max(A.LB.y, B.LB.y)
    if W <= 0 or H <= 0:
        return 0;
    SA = (A.RT.x - A.LB.x) * (A.RT.y - A.LB.y)
    SB = (B.RT.x - B.LB.x) * (B.RT.y - B.LB.y)
    cross = W * H
    return cross/(SA + SB - cross)

什麼是非極大值抑制

NMS:抑制不是極大值的元素,常用於目標檢測中提取領域分數最高的窗口,且抑制分數低的窗口。對於Bounding Box的列表B及其對應的置信度S,採用下面的計算方式:選擇具有最大score的檢測框M,將其從B集合中移除並加入到最終的檢測結果D中.通常將B中剩餘檢測框中與M的IoU大於閾值Nt的框從B中移除.重複這個過程,直到B爲空。

def py_cpu_nms(dets, thresh):
    """Pure Python NMS baseline."""
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1]

return keep

soft-NMS

在這裏插入圖片描述
代碼:

 ua = float((tx2 - tx1 + 1) * (ty2 - ty1 + 1) + area - iw * ih)
 ov = iw * ih / ua #iou between max box and detection box
 if method == 1: # linear
   if ov > Nt: 
     weight = 1 - ov
   else:
     weight = 1
 elif method == 2: # gaussian
   weight = np.exp(-(ov * ov)/sigma)
 else: # original NMS
   if ov > Nt: 
     weight = 0
    else:
     weight = 1
boxes[pos, 4] = weight*boxes[pos, 4]

移動端深度學習框架知道哪些?

知名的有TensorFlow Lite、小米MACE、騰訊的FeatherCNN、ncnn等,百度的MDL,驍龍SNPE。

有哪些輕量化模型?

一、SequeezeNet:
核心思想:
1.使用1x1卷積核代替3x3卷積核,減少參數量;
2.通過squeeze layer限制通道數量,減少參數量;
3.借鑑inception思想,將1x1和3x3卷積後結果進行concat;爲了使其feature map的size相同,3x3卷積核進行了padding;
4.減少池化層,並將池化操作延後,給卷積層帶來更大的激活層,保留更多地信息,提高準確率;
5.使用全局平均池化代替全連接層;
1-3通過fire module實現,如下圖所示:
在這裏插入圖片描述網絡結構:
在這裏插入圖片描述二、Xception
核心思想:
主要採用depthwise separable convolution思想(這個後面在mobile net中詳細解釋)
首先xception類似於下圖,但是區別有兩點:
在這裏插入圖片描述
1.Xception中沒有relu激活函數;
2.圖4是先1x1卷積,後通道分離;xception是先進行通道分離,即depthwise separable convolution,然後再進行1x1卷積。
3.進行殘差連接時,不再是concat,而是採用加法操作。
網絡結構:
在這裏插入圖片描述三、MobileNet
核心思想:
1.主要採用depthwise separable convolution,就是分離卷積核;
2.設置寬度因子width multipler和分辨率因子resolution multiplier;
在這裏插入圖片描述與普通卷積的計算量相比,N爲通道數,Dk爲特徵圖的大小:
在這裏插入圖片描述
怎麼才能使網絡進一步壓縮呢?可以進一步減少feature map的通道數和size,通過寬度因子減少通道數,分辨率因子減少size。

1、寬度因子α在這裏插入圖片描述
2、分辨率因子ρ
這裏寫圖片描述
兩個參數都屬於(0,1]之間,當爲1時則是標準mobileNet。
基本模塊:
在這裏插入圖片描述
網絡結構:
在這裏插入圖片描述四、ShuffleNet
核心思想:
1.借鑑resnext分組卷積思想,但不同的是採用1x1卷積核;
2.進行通道清洗,加強通道間的信息流通,提高信息表示能力。
分組卷積和通道清洗:
在這裏插入圖片描述Shuffle的方法:
1.卷積後一共得到g×n個輸出通道的feature map;
2.將feature map 進行 reshape爲(g,n);
3.進行轉置爲(n,g);
4.對轉置結果flatten,再分回g組作爲下一層的輸入。
三種Shuffle unit:
在這裏插入圖片描述網絡結構:
在這裏插入圖片描述

目標檢測RCNN系列的區別

1.RCNN:
在這裏插入圖片描述
網絡分爲四個部分:區域劃分、特徵提取、區域分類、邊框迴歸
區域劃分:使用selective search算法畫出2k個左右候選框,送入CNN
特徵提取:使用imagenet上訓練好的模型,進行finetune
區域分類:從頭訓練一個SVM分類器,對CNN出來的特徵向量進行分類
邊框迴歸:使用線性迴歸,對邊框座標進行精修

2.Fast RCNN
在這裏插入圖片描述
Fast R-CNN框架與R-CNN有兩處不同:
① 最後一個卷積層後加了一個ROI pooling layer;
② 損失函數使用了multi-task loss(多任務損失)函數,將邊框迴歸直接加到CNN網絡中訓練。分類Fast R-CNN直接用softmax替代R-CNN用的SVM進行分類。
③Fast R-CNN是端到端(end-to-end)的。

3.Faster RCNN
在這裏插入圖片描述
由兩部分組成:
①PRN候選框提取模塊;
②Fast R-CNN檢測模塊。

4.三者對比:
在這裏插入圖片描述
選擇性搜索Selective Search(SS):
step0:生成區域集R,具體參見論文《Efficient Graph-Based Image Segmentation》
step1:計算區域集R裏每個相鄰區域的相似度S={s1,s2,…}
step2:找出相似度最高的兩個區域,將其合併爲新集,添加進R
step3:從S中移除所有與step2中有關的子集
step4:計算新集與所有子集的相似度
step5:跳至step2,直至S爲空

區域建議網絡Region Proposal Network(RPN):

RPN在m,n特徵圖上會產生m * n * 9個anchor,計算每個產生的anchor和標註框的交併比IoU,大於0.7爲前景,小於0.3爲背景,去除0.3-0.7之間的anchor。對剩下的anchor輸入RoIPooling層

圖像哈希算法

1.均值哈希算法:
第一步,縮小尺寸。最快速的去除高頻和細節,將圖片縮小到8x8的尺寸,總共64個像素。摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。將縮小後的圖片,轉爲64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。將每個像素的灰度,與平均值進行比較。大於或等於平均值,記爲1;小於平均值,記爲0。
第五步,計算哈希值。將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都採用同樣次序就行了。
如果圖片放大或縮小,或改變縱橫比,結果值也不會改變。增加或減少亮度或對比度,或改變顏色,對hash值都不會太大的影響。最大的優點:計算速度快!

如果想比較兩張圖片,爲每張圖片構造hash值並且計算不同位的個數。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。

2.感知哈希算法:
第一步,縮小尺寸。最快速的去除高頻和細節,將圖片縮小到8x8的尺寸,總共64個像素。摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。將縮小後的圖片,轉爲64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算DCT(離散餘弦變換)。DCT是把圖片分解頻率聚集和梯狀形,雖然JPEG使用8 * 8的DCT變換,在這裏使用32 * 32的DCT變換。
第四步,縮小DCT。雖然DCT的結果是32 * 32大小的矩陣,但我們只要保留左上角的8*8的矩陣,這部分呈現了圖片中的最低頻率。
第五步,計算平均值。計算所有64個值的平均值。
第六步,進一步減小DCT。這是最主要的一步,根據8 * 8的DCT矩陣,設置0或1的64位的hash值,大於等於DCT均值的設爲”1”,小於DCT均值的設爲“0”。結果並不能告訴我們真實性的低頻率,只能粗略地告訴我們相對於平均值頻率的相對比例。只要圖片的整體結構保持不變,hash結果值就不變。能夠避免伽馬校正或顏色直方圖被調整帶來的影響。
第七步,計算哈希值。將64bit設置成64位的長整型,組合的次序並不重要,只要保證所有圖片都採用同樣次序就行了。將32 * 32的DCT轉換成32 * 32的圖像。
將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都採用同樣次序就行了(例如,自左到右、自頂向下、big-endian)。

得到指紋以後,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同於計算漢明距離。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。

3.差異哈希算法
第一步,縮小尺寸,縮放到9 * 8尺寸。
第二步,轉換灰度值,轉換到0-255之間。
第三步,差異值計算,差異值是通過計算每行相鄰像素的強度對比得出的。我們的圖片爲9 * 8的分辨率,那麼就有8行,每行9個像素。差異值是每行分別計算的,也就是第二行的第一個像素不會與第一行的任何像素比較。每一行有9個像素,那麼就會產生8個差異值,這也是爲何我們選擇9作爲寬度,因爲8bit剛好可以組成一個byte,方便轉換爲16進制值。
如果前一個像素的顏色強度大於第二個像素,那麼差異值就設置爲True(也就是1),如果不大於第二個像素,就設置爲False(也就是0)。
第四步,轉化爲hash值,將差異值數組中每一個值看做一個bit,每8個bit組成爲一個16進制值,將16進制值連接起來轉換爲字符串,就得出了最後的dHash值。
第五步,計算漢明距離,如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。

上池化,上採樣,反捲積,空洞卷積的區別

1.上池化:
在這裏插入圖片描述

2.上採樣:
在這裏插入圖片描述
3.反捲積:特徵圖補0,增大輸出的特徵圖
在這裏插入圖片描述
4.空洞卷積:卷積核補0,增大感受野
在這裏插入圖片描述

GAN幾種判別器的區別

https://www.jqr.com/article/000325

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章