本文主要整理了深度學習相關演演算法面試中經常問到的一些核心概念,並給出了細緻的解答,分享給大家。
內容整理自網路,原文連結:https://github.com/HarleysZhang/2019_algorithm_intern_information/blob/master/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E9%A2%98.md
感受野
後一層神經元在前一層神經元的感受空間,如下圖所示:
註意:小摺積核(如33)透過多層疊加可取得與大卷積核(如77)同等規模的感受野,此外採用小摺積核有兩個優勢:
1、小摺積核需多層疊加,加深了網路深度進而增強了網路容量(model capacity)和複雜度(model complexity)
2、增強了網路容量的同時減少了引數個數。
摺積操作作用
摺積網路中的摺積核引數是透過網路訓練出來的
透過摺積核的組合以及隨著網路後續操作的進行,摺積操作可獲取影象區域不同型別特徵;基本而一般的樣式會逐漸被抽象為具有高層語意的“概念”表示,也就是自動學習到影象的高層特徵。
CNN權值共享問題
首先權值共享就是濾波器共享,濾波器的引數是固定的,即是用相同的濾波器去掃一遍影象,提取一次特徵特徵,得到feature map。在摺積網路中,學好了一個濾波器,就相當於掌握了一種特徵,這個濾波器在影象中滑動,進行特徵提取,然後所有進行這樣操作的區域都會被採集到這種特徵,就好比上面的水平線。
CNN結構特點
區域性連線,權值共享,池化操作,多層次結構。
1、區域性連線使網路可以提取資料的區域性特徵
2、權值共享大大降低了網路的訓練難度,一個Filter只提取一個特徵,在整個圖片(或者語音/文字) 中進行摺積
3、池化操作與多層次結構一起,實現了資料的降維,將低層次的區域性特徵組合成為較高層次的特徵,從而對整個圖片進行表示。
pooling層作用
增加特徵平移不變性。匯合可以提高網路對微小位移的容忍能力。
減小特徵圖大小。匯合層對空間區域性區域進行下取樣,使下一層需要的引數量和計算量減少,並降低過擬合風險。
最大匯合可以帶來非線性。這是目前最大匯合更常用的原因之一。
Reference
(二)計算機視覺四大基本任務(分類、定位、檢測、分割
深度特徵的層次性
摺積操作可獲取影象區域不同型別特徵,而匯合等操作可對這些特徵進行融合和抽象,隨著若干摺積、匯合等操作的堆疊,各層得到的深度特徵逐漸從泛化特徵(如邊緣、紋理等)過渡到高層語意表示(軀幹、頭部等樣式)。
什麼樣的資料集不適合深度學習
資料集太小,資料樣本不足時,深度學習相對其它機器學習演演算法,沒有明顯優勢。
資料集沒有區域性相關特性,目前深度學習表現比較好的領域主要是影象/語音/自然語言處理等領域,這些領域的一個共性是區域性相關性。影象中畫素組成物體,語音訊號中音位組合成單詞,文字資料中單片語合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的區域性相關性的資料集,不適於使用深度學習演演算法進行處理。舉個例子:預測一個人的健康狀況,相關的引數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。
什麼造成梯度消失問題
神經網路的訓練中,透過改變神經元的權重,使網路的輸出值盡可能逼近標簽以降低誤差值,訓練普遍使用BP演演算法,核心思想是,計算出輸出與標簽間的損失函式值,然後計算其相對於每個神經元的梯度,進行權值的迭代。
梯度消失會造成權值更新緩慢,模型訓練難度增加。造成梯度消失的一個原因是,許多啟用函式將輸出值擠壓在很小的區間內,在啟用函式兩端較大範圍的定義域內梯度為0,造成學習停止。
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|。簡單總結一下就是:
1、L1 範數: 為 x 向量各個元素絕對值之和。
2、L2 範數: 為 x 向量各個元素平方和的 1/2 次方,L2 範數又稱 Euclidean 範數或 Frobenius 範數
3、Lp 範數: 為 x 向量各個元素絕對值 p 次方和的 1/p 次方. 在支援向量機學習過程中,L1 範數實際是一種對於成本函式求解最優的過程,因此,L1 範數正則化透過向成本函式中新增 L1 範數,使得學習得到的結果滿足稀疏化,從而方便人類提取特徵。
L1 範數可以使權值引數稀疏,方便特徵提取。L2 範數可以防止過擬合,提升模型的泛化能力。
TensorFlow計算圖
Tensorflow 是一個透過計算圖的形式來表述計算的程式設計系統,計算圖也叫資料流圖,可以把計算圖看做是一種有向圖,Tensorflow 中的每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。
BN(批歸一化)的作用
(1). 可以使用更高的學習率。如果每層的scale不一致,實際上每層需要的學習率是不一樣的,同一層不同維度的scale往往也需要不同大小的學習率,通常需要使用最小的那個學習率才能保證損失函式有效下降,Batch Normalization將每層、每維的scale保持一致,那麼我們就可以直接使用較高的學習率進行最佳化。
(2). 移除或使用較低的dropout。 dropout是常用的防止overfitting的方法,而導致overfit的位置往往在資料邊界處,如果初始化權重就已經落在資料內部,overfit現象就可以得到一定的緩解。論文中最後的模型分別使用10%、5%和0%的dropout訓練模型,與之前的40%-50%相比,可以大大提高訓練速度。
(3). 降低L2權重衰減繫數。還是一樣的問題,邊界處的區域性最優往往有幾維的權重(斜率)較大,使用L2衰減可以緩解這一問題,現在用了Batch Normalization,就可以把這個值降低了,論文中降低為原來的5倍。
(4). 取消Local Response Normalization層。由於使用了一種Normalization,再使用LRN就顯得沒那麼必要了。而且LRN實際上也沒那麼work。
(5). Batch Normalization調整了資料的分佈,不考慮啟用函式,它讓每一層的輸出歸一化到了均值為0方差為1的分佈,這保證了梯度的有效性,可以解決反向傳播過程中的梯度問題。目前大部分資料都這樣解釋,比如BN的原始論文認為的緩解了Internal Covariate Shift(ICS)問題。
什麼是梯度消失和爆炸,怎麼解決?
當訓練較多層數的模型時,一般會出現梯度消失問題(gradient vanishing problem)和梯度爆炸問題(gradient exploding problem)。註意在反向傳播中,當網路模型層數較多時,梯度消失和梯度爆炸是不可避免的。
深度神經網路中的梯度不穩定性,根本原因在於前面層上的梯度是來自於後面層上梯度的乘積。當存在過多的層次時,就出現了內在本質上的不穩定場景。前面的層比後面的層梯度變化更小,故變化更慢,故引起了梯度消失問題。前面層比後面層梯度變化更快,故引起梯度爆炸問題。
解決梯度消失和梯度爆炸問題,常用的有以下幾個方案:
預訓練模型 + 微調
梯度剪下 + 正則化
relu、leakrelu、elu等啟用函式
BN批歸一化
CNN中的殘差結構
LSTM結構
RNN迴圈神經網路理解
迴圈神經網路(recurrent neural network, RNN), 主要應用在語音識別、語言模型、機器翻譯以及時序分析等問題上。在經典應用中,摺積神經網路在不同的空間位置共享引數,迴圈神經網路是在不同的時間位置共享引數,從而能夠使用有限的引數處理任意長度的序列。 RNN可以看做作是同一神經網路結構在時間序列上被覆制多次的結果,這個被覆制多次的結構稱為迴圈體,如何設計迴圈體的網路結構是RNN解決實際問題的關鍵。RNN的輸入有兩個部分,一部分為上一時刻的狀態,另一部分為當前時刻的輸入樣本。
訓練過程中模型不收斂,是否說明這個模型無效,致模型不收斂的原因有哪些?
不一定。導致模型不收斂的原因有很多種可能,常見的有以下幾種:
沒有對資料做歸一化。
沒有檢查過你的結果。這裡的結果包括預處理結果和最終的訓練測試結果。
忘了做資料預處理。
忘了使用正則化。
Batch Size設的太大。
學習率設的不對。
最後一層的啟用函式用的不對。
網路存在壞梯度。比如Relu對負值的梯度為0,反向傳播時,0梯度就是不傳播。
引數初始化錯誤。
網路太深。隱藏層神經元數量錯誤。
更多回答,參考此連結。
影象處理中平滑和銳化操作是什麼?
平滑處理(smoothing)也稱模糊處理(bluring),主要用於消除影象中的噪聲部分,平滑處理常用的用途是用來減少影象上的噪點或失真,平滑主要使用影象濾波。在這裡,我個人認為可以把影象平滑和影象濾波聯絡起來,因為影象平滑常用的方法就是影象濾波器。在OpenCV3中常用的影象濾波器有以下幾種:
方框濾波——BoxBlur函式
均值濾波(鄰域平均濾波)——Blur函式
高斯濾波——GaussianBlur函式(高斯低通濾波是模糊,高斯高通濾波是銳化)
中值濾波——medianBlur函式
雙邊濾波——bilateralFilter函式 影象銳化操作是為了突出顯示影象的邊界和其他細節,而影象銳化實現的方法是透過各種運算元和濾波器實現的——Canny運算元、Sobel運算元、Laplacian運算元以及Scharr濾波器。
VGG使用2個3*3摺積的優勢在哪裡?
(1). 減少網路層引數。用兩個33摺積比用1個55摺積擁有更少的引數量,只有後者的2∗3∗35∗5=0.72。但是起到的效果是一樣的,兩個33的摺積層串聯相當於一個55的摺積層,感受野的大小都是5×5,即1個畫素會跟周圍5*5的畫素產生關聯。把下圖當成動態圖看,很容易看到兩個3×3摺積層堆疊(沒有空間池化)有5×5的有效感受野。
2個3*3摺積層
(2). 更多的非線性變換。2個33摺積層擁有比1個55摺積層更多的非線性變換(前者可以使用兩次ReLU啟用函式,而後者只有一次),使得摺積神經網路對特徵的學習能力更強。
paper中給出的相關解釋:三個這樣的層具有7×7的有效感受野。那麼我們獲得了什麼?例如透過使用三個3×3摺積層的堆疊來替換單個7×7層。首先,我們結合了三個非線性修正層,而不是單一的,這使得決策函式更具判別性。其次,我們減少引數的數量:假設三層3×3摺積堆疊的輸入和輸出有C個通道,堆疊摺積層的引數為3(32C2)=27C2個權重;同時,單個7×7摺積層將需要72C2=49C2個引數,即引數多81%。這可以看作是對7×7摺積濾波器進行正則化,迫使它們透過3×3濾波器(在它們之間註入非線性)進行分解。
此回答可以參考TensorFlow實戰p110,網上很多回答都說的不全。
Relu比Sigmoid效果好在哪裡?
Sigmoid函式公式如下:$\sigma (x)=\frac{1}{1+exp(-x)}$
ReLU啟用函式公式如下:
relu啟用函式
relu函式方程 ReLU 的輸出要麼是 0, 要麼是輸入本身。雖然方程簡單,但實際上效果更好。在網上看了很多版本的解釋,有從程式實體分析也有從數學上分析,我找了個相對比較直白的回答,如下:
1、ReLU函式計算簡單,可以減少很多計算量。反向傳播求誤差梯度時,涉及除法,計算量相對較大,採用ReLU啟用函式,可以節省很多計算量;
2、避免梯度消失問題。對於深層網路,sigmoid函式反向傳播時,很容易就會出現梯度消失問題(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成資訊丟失),從而無法完成深層網路的訓練。
3、可以緩解過擬合問題的發生。Relu會使一部分神經元的輸出為0,這樣就造成了網路的稀疏性,並且減少了引數的相互依存關係,緩解了過擬合問題的發生。
4、相比sigmoid型函式,ReLU函式有助於隨機梯度下降方法收斂。
參考連結
ReLU為什麼比Sigmoid效果好
神經網路中權值共享的理解?
權值(權重)共享這個詞是由LeNet5模型提出來的。以CNN為例,在對一張圖偏進行摺積的過程中,使用的是同一個摺積核的引數。比如一個3×3×1的摺積核,這個摺積核內9個的引數被整張圖共享,而不會因為影象內位置的不同而改變摺積核內的權繫數。說的再直白一些,就是用一個摺積核不改變其內權繫數的情況下摺積處理整張圖片(當然CNN中每一層不會只有一個摺積核的,這樣說只是為了方便解釋而已)。
參考資料
如何理解CNN中的權值共享
對fine-tuning(微調模型的理解),為什麼要修改最後幾層神經網路權值?
使用預訓練模型的好處,在於利用訓練好的SOTA模型權重去做特徵提取,可以節省我們訓練模型和調參的時間。
至於為什麼只微調最後幾層神經網路權重,是因為:(1). CNN中更靠近底部的層(定義模型時先新增到模型中的層)編碼的是更加通用的可復用特徵,而更靠近頂部的層(最後新增到模型中的層)編碼的是更專業業化的特徵。微調這些更專業化的特徵更加有用,它更代表了新資料集上的有用特徵。(2). 訓練的引數越多,過擬合的風險越大。很多SOTA模型擁有超過千萬的引數,在一個不大的資料集上訓練這麼多引數是有過擬合風險的,除非你的資料集像Imagenet那樣大。
參考資料
Python深度學習p127.
什麼是dropout?
dropout可以防止過擬合,dropout簡單來說就是:我們在前向傳播的時候,讓某個神經元的啟用值以一定的機率p停止工作,這樣可以使模型的泛化性更強,因為它不會依賴某些區域性的特徵。
dropout具體工作流程
以 標準神經網路為例,正常的流程是:我們首先把輸入資料x透過網路前向傳播,然後把誤差反向傳播一決定如何更新引數讓網路進行學習。使用dropout之後,過程變成如下:
(1). 首先隨機(臨時)刪掉網路中一半的隱藏神經元,輸入輸出神經元保持不變(圖3中虛線為部分臨時被刪除的神經元);
(2). 然後把輸入x透過修改後的網路進行前向傳播計算,然後把得到的損失結果透過修改的網路反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的引數(w,b);
(3). 然後重覆這一過程:
1、恢復被刪掉的神經元(此時被刪除的神經元保持原樣沒有更新w引數,而沒有被刪除的神經元已經有所更新)
2、 從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(同時備份被刪除神經元的引數)。
3、對一小批訓練樣本,先前向傳播然後反向傳播損失並根據隨機梯度下降法更新引數(w,b) (沒有被刪除的那一部分引數得到更新,刪除的神經元引數保持被刪除前的結果)。
dropout在神經網路中的應用
(1). 在訓練模型階段
不可避免的,在訓練網路中的每個單元都要新增一道機率流程,標準網路和帶有dropout網路的比較圖如下所示:
dropout在訓練階段
(2). 在測試模型階段
預測模型的時候,輸入是當前輸入,每個神經單元的權重引數要乘以機率p。
dropout在測試模型時
如何選擇dropout 的機率
input 的dropout機率推薦是0.8, hidden layer 推薦是0.5, 但是也可以在一定的區間上取值。(All dropout nets use p = 0.5 for hidden units and p = 0.8 for input units.)
參考資料
[Dropout:A Simple Way to Prevent Neural Networks from Overfitting]
深度學習中Dropout原理解析
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特徵檢測步驟
顏色空間歸一化——–>梯度計算————->梯度方向直方圖———->重疊塊直方圖歸一化———–>HOG特徵
參考資料
HOG特徵檢測-簡述
移動端深度學習框架知道哪些,用過哪些?
知名的有TensorFlow Lite、小米MACE、騰訊的ncnn等,目前都沒有用過。
如何提升網路的泛化能力
和防止模型過擬合的方法類似,另外還有模型融合方法。
BN演演算法,為什麼要在後面加加伽馬和貝塔,不加可以嗎?
最後的“scale and shift”操作則是為了讓因訓練所需而“刻意”加入的BN能夠有可能還原最初的輸入。不加也可以。
啟用函式的作用
啟用函式實現去線性化。神經元的結構的輸出為所有輸入的加權和,這導致神經網路是一個線性模型。如果將每一個神經元(也就是神經網路的節點)的輸出透過一個非線性函式,那麼整個神經網路的模型也就不再是線性的了,這個非線性函式就是啟用函式。常見的啟用函式有:ReLU函式、sigmoid函式、tanh函式。
ReLU函式:$f(x)=max(x,0)$
sigmoid函式:$f(x)=\frac{1}{1+e^{-x}}$
tanh函式:$f(x)=\frac{1+e^{-2x}}{1+e^{-2x}}$
摺積層和池化層有什麼區別
1、摺積層有引數,池化層沒有引數
2、經過摺積層節點矩陣深度會改變,池化層不會改變節點矩陣的深度,但是它可以縮小節點矩陣的大小。
摺積層引數數量計算方法
假設輸入層矩陣維度是96963,第一層摺積層使用尺寸為55、深度為16的過濾器(摺積核尺寸為55、摺積核數量為16),那麼這層摺積層的引數個數為553*16+16=1216個
摺積層輸出大小計算
摺積中的特徵圖大小計算方式有兩種,分別是‘VALID’和‘SAME’,摺積和池化都適用,除不盡的結果都向下取整。公式:O = (W-F+2P)/S+1,輸入圖片(Input)大小為I=WW,摺積核(Filter)大小為FF,步長(stride)為S,填充(Padding)的畫素數為P。
1、SAME填充方式:填充畫素。conv2d函式常用。
2、VALID填充方式:不填充畫素,Maxpooling2D函式常用。”SAME”摺積方式,對於輸入55影象,影象的每一個點都作為摺積核的中心。最後得到55的結果,通俗的來說:首先在原圖外層補一圈0,將原圖的第一點作為摺積核中心,若一圈0不夠,繼續補一圈0。如下圖所示:
摺積填充方式
神經網路為什麼用交叉熵損失函式
判斷一個輸出向量和期望的向量有多接近,交叉熵(cross entroy)是常用的評判方法之一。交叉熵刻畫了兩個機率分佈之間的距離,是分類問題中使用比較廣泛的一種損失函式。給定兩個機率分佈p和q,透過q來表示p的交叉熵公式為:H(p,q)=−∑p(x)logq(x)
softmax公式寫一下:
softmax(y){i} = \frac{e^{yi}}{\sum{j=1}^{n}e^{yj}} softmax公式
1*1摺積的主要作用有以下幾點
1、降維( dimension reductionality )。比如,一張500 * 500且厚度depth為100 的圖片在20個filter上做11的摺積,那麼結果的大小為500500*20。
2、加入非線性。摺積層之後經過激勵層,1*1的摺積在前一層的學習表示上添加了非線性激勵( non-linear activation ),提升網路的表達能力;
標的檢測基本概念
準確率、召回率、F1
混淆矩陣:
True Positive(真正例, TP):將正類預測為正類數.
True Negative(真負例, TN):將負類預測為負類數.
False Positive(假正例, FP):將負類預測為正類數 → 誤報 (Type I error).
False Negative(假負例子, FN):將正類預測為負類數 → 漏報 (Type II error).
查準率(準確率)P = TP/(TP+FP) 查全率(召回率)R = TP/(TP+FN) 準確率描述了模型有多準,即在預測為正例的結果中,有多少是真正例;召回率則描述了模型有多全,即在為真的樣本中,有多少被我們的模型預測為正例。以查準率P為縱軸、查全率R為橫軸作圖,就得到了查準率-查全率曲線,簡稱**”P-R“曲線,顯示改該曲線的圖稱為”P-R“圖。查準率、查全率效能的效能度量,除了”平衡點“(BEP),更為常用的是F1度量**:$$F1 = \frac{2PR}{P+R} = \frac{2*TP}{樣例總數+TP-TN}$$
F1度量的一般形式:$F_{\beta}$,能讓我們表達出對查準率/查全率的偏見,公式如下:$$F_{\beta} = \frac{1+\beta ^{2}PR}{(\beta ^{2}*P)+R}$$ $\beta >1$對查全率有更大影響,$\beta < 1$對查準率有更大影響。
不同的計算機視覺問題,對兩類錯誤有不同的偏好,常常在某一類錯誤不多於一定閾值的情況下,努力減少另一類錯誤。在標的檢測中,mAP(mean Average Precision)作為一個統一的指標將這兩種錯誤兼顧考慮。
map指標解釋
具體來說就是,在標的檢測中,對於每張圖片檢測模型會輸出多個預測框(遠超真實框的個數),我們使用IoU(Intersection Over Union,交並比)來標記預測框是否預測準確。標記完成後,隨著預測框的增多,查全率R總會上升,在不同查全率R水平下對準確率P做平均,即得到AP,最後再對所有類別按其所佔比例做平均,即得到mAP指標。
交並比IOU
交並比(Intersection-over-Union,IoU),標的檢測中使用的一個概念,是產生的候選框(candidate bound)與原標記框(ground truth bound)的交疊率,即它們的交集與並集的比值。最理想情況是完全重疊,即比值為1。計算公式如下:
程式碼實現如下:
# candidateBound = [x1, y1, x2, y2]
def calculateIoU(candidateBound, groundTruthBound):
cx1 = candidateBound[0]
cy1 = candidateBound[1]
cx2 = candidateBound[2]
cy2 = candidateBound[3]
gx1 = groundTruthBound[0]
gy1 = groundTruthBound[1]
gx2 = groundTruthBound[2]
gy2 = groundTruthBound[3]
carea = (cx2 – cx1) * (cy2 – cy1) #C的面積
garea = (gx2 – gx1) * (gy2 – gy1) #G的面積
x1 = max(cx1, gx1)
y1 = min(cy1, gy1) # 原點為(0, 0),所以這裡是min不是max
x2 = min(cx2, gx2)
y2 = max(cy2, gy2)
w = max(0, (x2 – x1))
h = max(0, (y2 – y1))
area = w * h #C∩G的面積
iou = area / (carea + garea – area)
return iou
資料增強方法,離線資料增強和線上資料增強有什麼區別?
常用資料增強方法:
翻轉:Fliplr,Flipud。不同於旋轉180度,這是類似鏡面的翻折,跟人在鏡子中的對映類似,常用水平、上下鏡面翻轉。
旋轉:rotate。順時針/逆時針旋轉,最好旋轉90-180度,否則會出現邊緣缺失或者超出問題,如旋轉45度。
縮放:zoom。影象可以被放大或縮小,imgaug庫可用Scal函式實現。
裁剪:crop。一般叫隨機裁剪,操作步驟是:隨機從影象中選擇一部分,然後降這部分影象裁剪出來,然後調整為原影象的大小。
平移:translation。平移是將影象沿著x或者y方向(或者兩個方向)移動。我們在平移的時候需對背景進行假設,比如說假設為黑色等等,因為平移的時候有一部分影象是空的,由於圖片中的物體可能出現在任意的位置,所以說平移增強方法十分有用。
放射變換:Affine。包含:平移(Translation)、旋轉(Rotation)、放縮(zoom)、錯切(shear)。
新增噪聲:過擬合通常發生在神經網路學習高頻特徵的時候,為消除高頻特徵的過擬合,可以隨機加入噪聲資料來消除這些高頻特徵。imgaug庫使用GaussianBlur函式。
亮度、對比度增強:這是影象色彩進行增強的操作
銳化:Sharpen。imgaug庫使用Sharpen函式。
資料增強分兩類,一類是離線增強,一類是線上增強:
離線增強 : 直接對資料集進行處理,資料的數目會變成增強因子 x 原資料集的數目 ,這種方法常常用於資料集很小的時候
線上增強 : 這種增強的方法用於,獲得 batch 資料之後,然後對這個batch的資料進行增強,如旋轉、平移、翻折等相應的變化,由於有些資料集不能接受線性級別的增長,這種方法長用於大的資料集,很多機器學習框架已經支援了這種資料增強方式,並且可以使用GPU最佳化計算。
ROI Pooling替換為ROI Align
,及各自原理
faster rcnn將roi pooling替換為roi align效果有所提升
ROI Pooling原理
ROI Align原理
Reference
1.深度學習中的資料增強
Reference
1、《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》閱讀筆記與實現
2、深度學習中 Batch Normalization為什麼效果好
3、詳解機器學習中的梯度消失、爆炸原因及其解決方法
Python/C/C++/計算機基礎/影象處理基礎
static關鍵字作用
在全域性變數前加上關鍵字static,全域性變數就定義為一個全域性靜態變數,全域性靜態變數在宣告它的檔案之外是不可見的,作用域範圍為從定義之處開始,到檔案結尾。
在函式傳回型別前加static,函式就變為靜態函式,靜態函式只在宣告它的檔案中使用,不被其他檔案所用。
C++指標和取用的區別
指標有自己的記憶體空間,而取用只是一個別名,類似於Python淺複製和深複製的區別
不存在空取用, 取用必須連結到一塊合法的記憶體地址;
一旦取用被初始化為一個物件,就不能指向另一個物件。指標可以在任何時候指向任何一個物件;
取用必須在建立時被初始化。指標可以在任何時間初始化。
C++中解構式的作用
解構式與建構式對應,類的解構式是類的一種特殊的成員函式,它會在每次刪除所建立的物件時執行。解構式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為字首,它不會傳回任何值,也不能帶有任何引數。解構式有助於在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源。
C++靜態函式和虛函式的區別
靜態函式在編譯的時候就已經確定執行時機,虛函式在執行的時候動態系結。虛函式因為用了虛函式表機制,呼叫的時候會增加一次記憶體開銷。
++i和i++區別
++i 先自增1,再傳回,i++,先傳回 i,再自增1.
const關鍵字作用
const型別的物件在程式執行期間不能被修改改變。
Python裝飾器解釋
裝飾器本質上是一個 Python 函式或類,它可以讓其他函式或類在不需要做任何程式碼修改的前提下增加額外功能,裝飾器的傳回值也是一個函式/類物件。它經常用於有切麵需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景,裝飾器是解決這類問題的絕佳設計。有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同程式碼到裝飾器中並繼續重用。概括的講,裝飾器的作用就是為已經存在的物件新增額外的功能。
多行程與多執行緒區別
執行緒是行程的一部分,一個行程至少有一個執行緒;
對於作業系統來說,一個任務就是一個行程,行程內的“子任務”稱為執行緒;
多執行緒和多行程最大的不同在於,多行程中,同一個變數,各自有一份複製存在於每個行程中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何一個變數都可以被任何一個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改一個變數,把內容給改亂了。
行程間呼叫、通訊和切換開銷均比多執行緒大,單個執行緒的崩潰會導致整個應用的退出。
存在大量IO,網路耗時或者需要和使用者互動等操作時,使用多執行緒有利於提高系統的併發性和使用者介面快速響應從而提高友好性。
map與reduce函式用法解釋下
1、 map函式接收兩個引數,一個是函式,一個是Iterable,map將傳入的函式依次作用到序列的每個元素,並將結果作為新的Iterator傳回,簡單示例程式碼如下:
# 示例1
def square(x):
return x ** 2
r = map(square, [1, 2, 3, 4, 5, 6, 7])
squareed_list = list(r)
print(squareed_list) # [1, 4, 9, 16, 25, 36, 49]
# 使用lambda匿名函式簡化為一行程式碼
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
# 示例2
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) # [‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]
註意map函式傳回的是一個Iterator(惰性序列),要透過list函式轉化為常用串列結構。map()作為高階函式,事實上它是把運算規則抽象了。
2、reduce()函式也接受兩個引數,一個是函式(兩個引數),一個是序列,與map不同的是reduce把結果繼續和序列的下一個元素做累積計算,效果如下:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) 示例程式碼如下:
from functools import reduce
CHAR_TO_INT = {
‘0’: 0,
‘1’: 1,
‘2’: 2,
‘3’: 3,
‘4’: 4,
‘5’: 5,
‘6’: 6,
‘7’: 7,
‘8’: 8,
‘9’: 9
}
def str2int(str):
ints = map(lambda x:CHAR_TO_INT[x], str) # str物件是Iterable物件
return reduce(lambda x,y:10*x + y, ints)
print(str2int(‘0’))
print(str2int(‘12300’))
print(str2int(‘0012345’)) # 0012345
Python深複製、淺複製區別
1、直接賦值:其實就是物件的取用(別名)。
2、淺複製(copy):複製父物件,不會複製物件的內部的子物件。copy淺複製,沒有複製子物件,所以原始資料改變,子物件會改變。
3、深複製(deepcopy):copy 模組的 deepcopy 方法,完全複製了父物件及其子物件,兩者是完全獨立的。深複製,包含物件裡面的自物件的複製,所以原始物件的改變不會造成深複製裡任何子元素的改變。看一個示例程式,就能明白淺複製與深複製的區別了:
#!/usr/bin/Python3
# -*-coding:utf-8 -*-
import copy
a = [1, 2, 3, [‘a’, ‘b’, ‘c’]]
b = a # 賦值,傳物件的取用
c = copy.copy(a) # 淺複製
d = copy.deepcopy(a) # 深複製
a.append(4)
a[3].append(‘d’)
print(‘a = ‘, a)
print(‘b = ‘, b)
print(‘c = ‘, c)
print(‘d = ‘, d) # [1, 2, 3, [‘a’, ‘b’, ‘c’]]
程式輸出如下:
a = [1, 2, 3, [‘a’, ‘b’, ‘c’, ‘d’], 4] b = [1, 2, 3, [‘a’, ‘b’, ‘c’, ‘d’], 4] c = [1, 2, 3, [‘a’, ‘b’, ‘c’, ‘d’]] d = [1, 2, 3, [‘a’, ‘b’, ‘c’]]
影象銳化方法
銳化主要影響影象中的低頻分量,不影響影象中的高頻分量像銳化的主要目的有兩個:
1、增強影象邊緣,使模糊的影象變得更加清晰,顏色變得鮮明突出,影象的質量有所改善,產生更適合人眼觀察和識別的影象;
2、過銳化處理後,標的物體的邊緣鮮明,以便於提取標的的邊緣、對影象進行分割、標的區域識別、區域形狀提取等,進一步的影象理解與分析奠定基礎。
影象銳化一般有兩種方法:
1、微分法
2、高通濾波法
一般來說,影象的能量主要集中在其低頻部分,噪聲所在的頻段主要在高頻段,同時影象邊緣資訊也主要集中在其高頻部分。這將導致原始影象在平滑處理之後,影象邊緣和影象輪廓模糊的情況出現。為了減少這類不利效果的影響,就需要利用影象銳化技術,使影象的邊緣變得清晰。影象銳化處理的目的是為了使影象的邊緣、輪廓線以及影象的細節變得清晰,經過平滑的影象變得模糊的根本原因是因為影象受到了平均或積分運算,因此可以對其進行逆運算(如微分運算)就可以使影象變得清晰。微分運算是求訊號的變化率,由傅立葉變換的微分性質可知,微分運算具有較強高頻分量作用。從頻率域來考慮,影象模糊的實質是因為其高頻分量被衰減,因此可以用高通濾波器來使影象清晰。但要註意能夠進行銳化處理的影象必須有較高的性噪比,否則銳化後影象性噪比反而更低,從而使得噪聲增加的比訊號還要多,因此一般是先去除或減輕噪聲後再進行銳化處理。
Reference
影象增強-影象銳化
numpy手撕程式碼
人臉識別的場景下,輸入10512的feature map,用這個在1000512的特徵庫當中用歐氏距離去匹配10512的feature map,用這個在1000512的特徵庫當中用歐氏距離去匹配101000的特徵,得到這個output。
機器學習
Focal Loss 介紹一下
資料不平衡怎麼辦?
AUC的理解
AUC的計算公式
朋友會在“發現-看一看”看到你“在看”的內容