導(dǎo)讀
本文總結(jié)了一些秋招面試中會遇到的問題和一些重要的知識點,適合面試前突擊和鞏固基礎(chǔ)知識。
前言
最近這段時間正臨秋招,這篇文章是老潘在那會找工作過程中整理的一些重要知識點,內(nèi)容比較雜碎,部分采集于網(wǎng)絡(luò),簡單整理下發(fā)出來,適合面試前突擊,當(dāng)然也適合鞏固基礎(chǔ)知識。另外推薦大家一本叫做《百面機器學(xué)習(xí)》的新書,2018年8月份出版的,其中包括了很多機器學(xué)習(xí)、深度學(xué)習(xí)面試過程中會遇到的問題,比較適合需要準(zhǔn)備面試的機器學(xué)習(xí)、深度學(xué)習(xí)方面的算法工程師,當(dāng)然也同樣適合鞏固基礎(chǔ)~有時間一定要需要看的書籍:
程序員的數(shù)學(xué)系列,適合重溫知識,回顧一些基礎(chǔ)的線性代數(shù)、概率論。
深度學(xué)習(xí)花書,總結(jié)類書,有基礎(chǔ)知識的講解,比較全面。
統(tǒng)計學(xué)習(xí)方法,總結(jié)類書,篇幅不長,都是核心。
Pattern Recognition and Machine Learning,條理清晰,用貝葉斯的方式來講解機器學(xué)習(xí)。
機器學(xué)習(xí)西瓜書,適合當(dāng)教材,內(nèi)容較廣但是不深。
?
百翻不爛的百面機器學(xué)習(xí)
常見的常識題
L1正則可以使少數(shù)權(quán)值較大,多數(shù)權(quán)值為0,得到稀疏的權(quán)值;L2正則會使權(quán)值都趨近于0但非零,得到平滑的權(quán)值;
在AdaBoost算法中,被錯分的樣本的權(quán)重更新比例的公式相同;
Boosting和Bagging都是組合多個分類器投票的方法,但Boosting是根據(jù)單個分類器的正確率決定其權(quán)重,Bagging是可簡單地設(shè)置所有分類器權(quán)重相同;
EM算法不能保證找到全局最優(yōu)值;
SVR中核函數(shù)寬度小欠擬合,寬度大容易過擬合
PCA和LDA都是經(jīng)典的降維算法。PCA是無監(jiān)督的,也就是訓(xùn)練樣本不需要標(biāo)簽;LDA是有監(jiān)督的,也就是訓(xùn)練樣本需要標(biāo)簽。PCA是去除掉原始數(shù)據(jù)中冗余的維度,而LDA是尋找一個維度,使得原始數(shù)據(jù)在該維度上投影后不同類別的數(shù)據(jù)盡可能分離開來。
PCA是一種正交投影,它的思想是使得原始數(shù)據(jù)在投影子空間的各個維度的方差最大。假設(shè)我們要將N維的數(shù)據(jù)投影到M維的空間上(M
PCA和LDA
參考鏈接:PCA和LDA的對比
KNN K近鄰
關(guān)于K近鄰算法的知識有很多,比如算法執(zhí)行的步驟、應(yīng)用領(lǐng)域以及注意事項,不過相信很多人對K近鄰算法的使用注意事項不是很清楚。在這篇文章中我們針對這個問題進行解答,帶大家來好好了解一下k近鄰算法的注意事項以及K近鄰算法的優(yōu)點與缺點。
K近鄰算法的注意事項
K近鄰算法的使用注意事項具體就是使用距離作為度量時,要保證所有特征在數(shù)值上是一個數(shù)量級上,以免距離的計算被數(shù)量級大的特征所主導(dǎo)。在數(shù)據(jù)標(biāo)準(zhǔn)化這件事上,還要注意一點,訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集一定要使用同一標(biāo)準(zhǔn)的標(biāo)準(zhǔn)化。其中的原因總的來說就有兩點內(nèi)容,第一就是標(biāo)準(zhǔn)化其實可以視為算法的一部分,既然數(shù)據(jù)集都減去了一個數(shù),然后除以一個數(shù),這兩個數(shù)對于所有的數(shù)據(jù)來說,就要一視同仁。第二就是訓(xùn)練數(shù)據(jù)集其實很少,在預(yù)測新樣本的時候,新樣本就更少得可憐,如果新樣本就一個數(shù)據(jù),它的均值就是它自己,標(biāo)準(zhǔn)差是0,這根本就不合理。
K近鄰算法的優(yōu)點是什么呢?
K近鄰算法的優(yōu)點具體體現(xiàn)在四方面。第一就就是k近鄰算法是一種在線技術(shù),新數(shù)據(jù)可以直接加入數(shù)據(jù)集而不必進行重新訓(xùn)練,第二就是k近鄰算法理論簡單,容易實現(xiàn)。第三就是準(zhǔn)確性高,對異常值和噪聲有較高的容忍度。第四就是k近鄰算法天生就支持多分類,區(qū)別與感知機、邏輯回歸、SVM。
K近鄰算法的缺點是什么呢?
K近鄰算法的缺點,基本的 k近鄰算法每預(yù)測一個“點”的分類都會重新進行一次全局運算,對于樣本容量大的數(shù)據(jù)集計算量比較大。而且K近鄰算法容易導(dǎo)致維度災(zāi)難,在高維空間中計算距離的時候,就會變得非常遠(yuǎn);樣本不平衡時,預(yù)測偏差比較大,k值大小的選擇得依靠經(jīng)驗或者交叉驗證得到。k的選擇可以使用交叉驗證,也可以使用網(wǎng)格搜索。k的值越大,模型的偏差越大,對噪聲數(shù)據(jù)越不敏感,當(dāng) k的值很大的時候,可能造成模型欠擬合。k的值越小,模型的方差就會越大,當(dāng) k的值很小的時候,就會造成模型的過擬合。
二維高斯核函數(shù)
如果讓你寫一個高斯模糊的函數(shù),你該怎么寫呢?
?
?
?
?
訓(xùn)練采樣方法
交叉驗證
留一法
自助法(bootstrap):有放回的抽樣方法,可能會抽到重復(fù)的樣本
Kmean和GMM原理、區(qū)別、應(yīng)用場景
kmeans的收斂性?
可以看這里 https://zhuanlan.zhihu.com/p/36331115
也可以看百面機器學(xué)習(xí)P93、P102
如何在多臺計算機上做kmeans
其實是這樣的,先分布到n臺機器上,要保證k個初始化相同,經(jīng)過一次迭代后,拿到k*n個新的mean,放到一臺新的機器上,因為初始化相同,所以mean的排列相同,然后對屬于每個類的n個mean做加權(quán)平均,再放回每臺機器上做下一步迭代。
KNN算法以及流程
K值的選擇:
K值較小,則模型復(fù)雜度較高,容易發(fā)生過擬合,學(xué)習(xí)的估計誤差會增大,預(yù)測結(jié)果對近鄰的實例點非常敏感。
K值較大可以減少學(xué)習(xí)的估計誤差,但是學(xué)習(xí)的近似誤差會增大,與輸入實例較遠(yuǎn)的訓(xùn)練實例也會對預(yù)測起作用,使預(yù)測發(fā)生錯誤,k值增大模型的復(fù)雜度會下降。
在應(yīng)用中,k值一般取一個比較小的值,通常采用交叉驗證法來來選取最優(yōu)的K值。
KNN中的K值選取對分類的結(jié)果影響至關(guān)重要,K值選取的太小,模型太復(fù)雜。K值選取的太大,導(dǎo)致分類模糊。那么K值到底怎么選取呢?有人用Cross Validation,有人用貝葉斯,還有的用bootstrap。而距離度量又是另外一個問題,比較常用的是選用歐式距離??墒沁@個距離真的具有普適性嗎?《模式分類》中指出歐式距離對平移是敏感的,這點嚴(yán)重影響了判定的結(jié)果。在此必須選用一個對已知的變換(比如平移、旋轉(zhuǎn)、尺度變換等)不敏感的距離度量。書中提出了采用切空間距離(tangent distance)來替代傳統(tǒng)的歐氏距離。
無監(jiān)督學(xué)習(xí)和有監(jiān)督學(xué)習(xí)的區(qū)別
有監(jiān)督:
感知機
K近鄰法
樸素貝葉斯
決策樹
邏輯回歸
支持向量機
提升方法
隱馬爾科夫模型
條件隨機場
無監(jiān)督:
聚類-kmeans
SVD奇異值分解
PCA主成分分析
生成式模型:LDA KNN 混合高斯 貝葉斯 馬爾科夫 深度信念 判別式模型:SVM NN LR CRF CART
邏輯回歸與SVM區(qū)別
邏輯回歸即LR。LR預(yù)測數(shù)據(jù)的時候,給出的是一個預(yù)測結(jié)果為正類的概率,這個概率是通過sigmoid函數(shù)將wTx映射到[0,1]得到的,對于wTx正的很大時(可以認(rèn)為離決策邊界很遠(yuǎn)),得到為正類的概率趨近于1;對于wTx負(fù)的很大時(可以認(rèn)為離決策邊界很遠(yuǎn)),得到為正類的概率趨近于0。在LR中,跟“與決策邊界距離”扯得上關(guān)系的僅此而已。在參數(shù)w求解過程中完全沒有與決策邊界距離的影子,所有樣本都一視同仁。和感知機的不同之處在于,LR用到與決策邊界的距離,是用來給預(yù)測結(jié)果一個可以看得到的置信區(qū)間。感知機里面沒有這一考慮,只根據(jù)符號來判斷。而SVM更進一步,在參數(shù)的求解過程中,便舍棄了距離決策邊界過遠(yuǎn)的點。LR和感知機都很容易過擬合,只有SVM加入了L2范數(shù)之后的結(jié)構(gòu)化風(fēng)險最小化策略才解決了過擬合的問題。總結(jié)之:
感知機前后都沒有引入與超平面“距離”的概念,它只關(guān)心是否在超平面的一側(cè);
LR引入了距離,但是在訓(xùn)練模型求其參數(shù)的時候沒有距離的概念,只是在最后預(yù)測階段引入距離以表征分類的置信度;
SVM兩個地方有距離的概念:其一,在求超平面參數(shù)的時候有距離的概念,其表現(xiàn)為在與超平面一定距離內(nèi)的點著重關(guān)注,而其他的一切點都不再關(guān)注。被關(guān)注的點稱之為“支撐向量”。其二,預(yù)測新樣本的時候,和LR一樣,距離代表置信度。
邏輯回歸只能解決二分類問題,多分類用softmax。相關(guān)參考鏈接
https://blog.csdn.net/maymay_/article/details/80016175
https://blog.csdn.net/jfhdd/article/details/52319422
https://www.cnblogs.com/eilearn/p/9026851.html
bagging boosting 和 提升樹
bagging是通過結(jié)合幾個模型降低泛化誤差,分別訓(xùn)練幾個不同的模型,然后讓所有的模型表決測試樣例的輸出。模型平均奏效的原因是不同的模型通常不會在測試集上產(chǎn)生完全相同的誤差。從原始樣本集中抽取訓(xùn)練集.每輪從原始樣本集中使用Bootstraping的方法抽取n個訓(xùn)練樣本(在訓(xùn)練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中).共進行k輪抽取,得到k個訓(xùn)練集.(k個訓(xùn)練集相互獨立)
Bagging是并行的學(xué)習(xí)算法,思想很簡單,即每一次從原始數(shù)據(jù)中根據(jù)均勻概率分布有放回的抽取和原始數(shù)據(jù)集一樣大小的數(shù)據(jù)集合。樣本點可以出現(xiàn)重復(fù),然后對每一次產(chǎn)生的數(shù)據(jù)集構(gòu)造一個分類器,再對分類器進行組合。對于分類問題,將上步得到的k個模型采用投票的方式得到分類結(jié)果;對回歸問題,計算上述模型的均值作為最后的結(jié)果.
Boosting是一族可將弱學(xué)習(xí)器提升為強學(xué)習(xí)器的算法.Boosting的每一次抽樣的樣本分布是不一樣的,每一次迭代,都是根據(jù)上一次迭代的結(jié)果,增加被錯誤分類的樣本的權(quán)重。使模型在之后的迭代中更加注重難以分類的樣本。這是一個不斷學(xué)習(xí)的過程,也是一個不斷提升的過程,這就是Boosting思想的本質(zhì)所在。迭代之后,將每次迭代的基分類器進行集成,那么如何進行樣本權(quán)重的調(diào)整和分類器的集成是我們需要考慮的關(guān)鍵問題。
Bagging和Boosting的區(qū)別:
1)樣本選擇上:Bagging:訓(xùn)練集是在原始集中有放回選取的,從原始集中選出的各輪訓(xùn)練集之間是獨立的. Boosting:每一輪的訓(xùn)練集不變,只是訓(xùn)練集中每個樣例在分類器中的權(quán)重發(fā)生變化.而權(quán)值是根據(jù)上一輪的分類結(jié)果進行調(diào)整.
2)樣例權(quán)重:Bagging:使用均勻取樣,每個樣例的權(quán)重相等 Boosting:根據(jù)錯誤率不斷調(diào)整樣例的權(quán)值,錯誤率越大則權(quán)重越大.
3)預(yù)測函數(shù):Bagging:所有預(yù)測函數(shù)的權(quán)重相等. Boosting:每個弱分類器都有相應(yīng)的權(quán)重,對于分類誤差小的分類器會有更大的權(quán)重.
4)并行計算:Bagging:各個預(yù)測函數(shù)可以并行生成 Boosting:各個預(yù)測函數(shù)只能順序生成,因為后一個模型參數(shù)需要前一輪模型的結(jié)果.
Bagging 是 Bootstrap Aggregating 的簡稱,意思就是再取樣 (Bootstrap) 然后在每個樣本上訓(xùn)練出來的模型取平均,所以是降低模型的 variance. Bagging 比如 Random Forest 這種先天并行的算法都有這個效果。Boosting 則是迭代算法,每一次迭代都根據(jù)上一次迭代的預(yù)測結(jié)果對樣本進行加權(quán),所以隨著迭代不斷進行,誤差會越來越小,所以模型的 bias 會不斷降低High variance 是model過于復(fù)雜overfit,記住太多細(xì)節(jié)noise,受outlier影響很大;high bias是underfit,model過于簡單,cost function不夠好。boosting是把許多弱的分類器組合成一個強的分類器。弱的分類器bias高,而強的分類器bias低,所以說boosting起到了降低bias的作用。variance不是boosting的主要考慮因素。bagging是對許多強(甚至過強)的分類器求平均。在這里,每個單獨的分類器的bias都是低的,平均之后bias依然低;而每個單獨的分類器都強到可能產(chǎn)生overfitting的程度,也就是variance高,求平均的操作起到的作用就是降低這個variance。Bagging算法的代表:RandomForest隨機森林算法的注意點:
在構(gòu)建決策樹的過程中是不需要剪枝的。
整個森林的樹的數(shù)量和每棵樹的特征需要人為進行設(shè)定。
構(gòu)建決策樹的時候分裂節(jié)點的選擇是依據(jù)最小基尼系數(shù)的。
咱們機器學(xué)習(xí)升級版的隨機森林章節(jié),我用白板寫了寫這個公式:p = 1 - (1 - 1/N)^N,其意義是:一個樣本在一次決策樹生成過程中,被選中作為訓(xùn)練樣本的概率,當(dāng)N足夠大時,約等于63.2%。簡言之,即一個樣本被選中的概率是63.2%,根據(jù)二項分布的的期望,這意味著大約有63.2%的樣本被選中。即有63.2%的樣本是不重復(fù)的,有36.8%的樣本可能沒有在本次訓(xùn)練樣本集中。隨機森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數(shù)而定。隨機森林的隨機性體現(xiàn)在每顆樹的訓(xùn)練樣本是隨機的,樹中每個節(jié)點的分裂屬性集合也是隨機選擇確定的。有了這2個隨機的保證,隨機森林就不會產(chǎn)生過擬合的現(xiàn)象了。隨機森林是用一種隨機的方式建立的一個森林,森林是由很多棵決策樹組成的,每棵樹所分配的訓(xùn)練樣本是隨機的,樹中每個節(jié)點的分裂屬性集合也是隨機選擇確定的。
SVM
相關(guān)的notebook除了cs231n也可以看這里。
https://momodel.cn/workspace/5d37bb9b1afd94458f84a521?type=module
凸集、凸函數(shù)、凸優(yōu)化
面試見得比較少,感興趣的可以看下:
https://blog.csdn.net/feilong_csdn/article/details/83476277
為什么深度學(xué)習(xí)中的圖像分割要先編碼后解碼
降采樣是手段不是目的:
降低顯存和計算量,圖小了顯存也小,計算量也小;
增大感受野,使用同樣3x3的卷積能在更大的圖像范圍上進行特征提取。大感受野對分割很重要,小感受野做不了多分類分割,而且分割出來很粗糙
多出幾條不同程度額下采樣分支,可以方便進行多尺度特征的融合。多級語義融合會讓分類更加準(zhǔn)確。
降采樣的理論意義,我簡單朗讀一下,它可以增加對輸入圖像的一些小擾動的魯棒性,比如圖像平移,旋轉(zhuǎn)等,減少過擬合的風(fēng)險,降低運算量,和增加感受野的大小。相關(guān)鏈接:為什么深度學(xué)習(xí)中的圖像分割要先編碼再解碼?
(全局)平均池化average pooling和(全局)最大池化max pooling的區(qū)別
最大池化保留了紋理特征
平均池化保留整體的數(shù)據(jù)特征
全局平均池化有定位的作用(看知乎)
最大池化提取邊緣等“最重要”的特征,而平均池化提取的特征更加smoothly。對于圖像數(shù)據(jù),你可以看到差異。雖然兩者都是出于同樣的原因使用,但我認(rèn)為max pooling更適合提取極端功能。平均池有時不能提取好的特征,因為它將全部計入并計算出平均值,這對于對象檢測類型任務(wù)可能不好用但使用平均池化的一個動機是每個空間位置具有用于期望特征的檢測器,并且通過平均每個空間位置,其行為類似于平均輸入圖像的不同平移的預(yù)測(有點像數(shù)據(jù)增加)。Resnet不是采用傳統(tǒng)的完全連通層進行CNN分類,而是直接從最后一個mlp轉(zhuǎn)換層輸出特征圖的空間平均值,作為通過全局平均合并層的類別置信度,然后將得到的矢量輸入到 softmax層。相比之下,Global average更有意義且可解釋,因為它強制實現(xiàn)了feature和類別之間的對應(yīng)關(guān)系,這可以通過使用網(wǎng)絡(luò)的更強大的本地建模來實現(xiàn)。此外,完全連接的層易于過擬合并且嚴(yán)重依賴于 dropout 正則化,而全局平均池化本身就是起到了正則化作用,其本身防止整體結(jié)構(gòu)的過擬合。
https://zhuanlan.zhihu.com/p/42384808
https://www.zhihu.com/question/335595503/answer/778307744
https://www.zhihu.com/question/309713971/answer/578634764
全連接的作用,與1x1卷積層的關(guān)系
在實際使用中,全連接層可由卷積操作實現(xiàn):對前層是全連接的全連接層可以轉(zhuǎn)化為卷積核為1x1的卷積;而前層是卷積層的全連接層可以轉(zhuǎn)化為卷積核為hxw的全局卷積,h和w分別為前層卷積結(jié)果的高和寬使用 global average pooling 全局平均池化來代替卷積
全連接層(fully connected layers,F(xiàn)C)在整個卷積神經(jīng)網(wǎng)絡(luò)中起到“分類器”的作用。如果說卷積層、池化層和激活函數(shù)層等操作是將原始數(shù)據(jù)映射到隱層特征空間的話,全連接層則起到將學(xué)到的“分布式特征表示”映射到樣本標(biāo)記空間的作用。在實際使用中,全連接層可由卷積操作實現(xiàn):對前層是全連接的全連接層可以轉(zhuǎn)化為卷積核為1x1的卷積;而前層是卷積層的全連接層可以轉(zhuǎn)化為卷積核為hxw的全局卷積,h和w分別為前層卷積結(jié)果的高和寬
那么,1*1卷積的主要作用有以下幾點:
降維( dimension reductionality )。比如,一張500x500且厚度depth為100的圖片在20個filter上做1*1的卷積,那么結(jié)果的大小為500*500*20。
加入非線性。卷積層之后經(jīng)過激勵層,1*1的卷積在前一層的學(xué)習(xí)表示上添加了非線性激勵( non-linear activation ),提升網(wǎng)絡(luò)的表達能力,但是也可以這樣說:使之由單純的線性變換,變?yōu)閺?fù)雜的feature map之間的線性組合,從而實現(xiàn)特征的高度抽象過程。這一過程視為由線性變換為非線性,提高抽象程度。而非加入激活函數(shù)的作用。
個人應(yīng)該是降維或者升維來減小參數(shù)個數(shù)和增加網(wǎng)絡(luò)深度,以及跨通道的特征聚合
可以代替全連接層
看這個問題的回答?https://www.zhihu.com/question/56024942/answer/369745892?
看這個問題的回答?https://www.zhihu.com/question/41037974/answer/150522307
concat與add(sum)的區(qū)別
對于兩路輸入來說,如果是通道數(shù)相同且后面帶卷積的話,add等價于concat之后對應(yīng)通道共享同一個卷積核。下面具體用式子解釋一下。由于每個輸出通道的卷積核是獨立的,我們可以只看單個通道的輸出。假設(shè)兩路輸入的通道分別為X1, X2, ..., Xc和Y1, Y2, ..., Yc。那么concat的單個輸出通道為(*表示卷積):
而add的單個輸出通道為:
因此add相當(dāng)于加了一種prior,當(dāng)兩路輸入可以具有“對應(yīng)通道的特征圖語義類似”(可能不太嚴(yán)謹(jǐn))的性質(zhì)的時候,可以用add來替代concat,這樣更節(jié)省參數(shù)和計算量(concat是add的2倍)。FPN[1]里的金字塔,是希望把分辨率最小但語義最強的特征圖增加分辨率,從性質(zhì)上是可以用add的。如果用concat,因為分辨率小的特征通道數(shù)更多,計算量是一筆不少的開銷。https://www.zhihu.com/question/306213462/answer/562776112
concat改成sum確實會好很多,這兩個都是特征融合,到底有什么本質(zhì)區(qū)別呢?我用的時候也沒什么原則就是兩個都試一下(其實更喜歡用sum,畢竟更省顯存)。
我之前做過類似ASP的實驗,金字塔型空洞卷積融合,最后實驗結(jié)果sum比concat要好一些,但是原因不知道怎么解釋
我看過一些論文是concat比sum好的,可能這跟數(shù)據(jù)集等具體情況有關(guān)吧
不同的特征 sum 了,有什么意義呢,這些特征又損失了吧;如果直接 concat,讓后面的網(wǎng)絡(luò)學(xué)習(xí),應(yīng)該更好啊,用到的特征更多了
SSD怎么改動變成FasterRCNN
SSD是直接分類,而FasterRcnn是先判斷是否為背景再進行分類。一個是直接細(xì)分類,一個是先粗分類再細(xì)分類。
反向傳播的原理
反向傳播原理看CS231n中的BP過程,以及Jacobian的傳播。
GD、SGD、mini batch GD的區(qū)別
在百面深度學(xué)習(xí)中有相應(yīng)的章節(jié)。
偏差、方差
有一篇文章比較好的介紹了,還有在那本電子版CNNbook中也有。
http://scott.fortmann-roe.com/docs/BiasVariance.html
泛化誤差可以分解成偏差的平方+方差+噪聲
偏差度量了學(xué)習(xí)算法的期望預(yù)測和真實結(jié)果的偏離程度,刻畫了學(xué)習(xí)算法本身的擬合能力
方差度量了同樣大小的訓(xùn)練集的變動所導(dǎo)致的學(xué)習(xí)性能的變化,刻畫了數(shù)據(jù) 擾動所造成的干擾
噪聲表達了當(dāng)前任務(wù)上學(xué)習(xí)任何算法所能達到的期望泛化誤差下界,刻畫了問題本身的難度。
偏差和方差一般稱為bias和variance,一般訓(xùn)練誤差越強,偏差越小,方差越大,泛化誤差在中間會有一個最小值。
如果偏差較大,方差較小,此時為欠擬合,而偏差較小,方差較大為過擬合。
為什么會梯度爆炸,如何防止
多層神經(jīng)網(wǎng)絡(luò)通常存在像懸崖一樣的結(jié)構(gòu),這是由于幾個較大的權(quán)重相乘導(dǎo)致的。遇到斜率很大的懸崖結(jié)構(gòu),梯度更新會很大程序地改變參數(shù)值,通常會完全跳過這類懸崖的結(jié)構(gòu)?;〞鳳177.
分布式訓(xùn)練,多卡訓(xùn)練
http://ai.51cto.com/art/201710/555389.htm?
https://blog.csdn.net/xs11222211/article/details/82931120#commentBox
精確率和召回率以及PR曲線
這個講的比較好(TP與FP和ROC曲線):
https://segmentfault.com/a/1190000014829322
精確率是指分類正確的正樣本個數(shù)占分類器判定為正樣本的樣本個數(shù)的比例。召回率是指分類正確的正樣本個數(shù)占真正的正樣本個數(shù)的比例。Precision值和Recall值是既矛盾又統(tǒng)一的兩個指標(biāo),為了提高Precision值,分類器需要盡量在“更有把握”時才把樣本預(yù)測為正樣本,但此時往往會因為過于保守而漏掉很多“沒有把握”的正樣本,導(dǎo)致Recall值很低。如何權(quán)衡這兩個值,所以出現(xiàn)了PR曲線、ROC曲線以及F1 score等更多的標(biāo)準(zhǔn)來進行判斷。https://www.cnblogs.com/xuexuefirst/p/8858274.html
Yolov2相比Yolov1因為采用了先驗框(Anchor Boxes),模型的召回率大幅提升,同時map輕微下降了0.2。
https://segmentfault.com/a/1190000014829322?
https://www.cnblogs.com/eilearn/p/9071440.html?
https://blog.csdn.net/zdh2010xyz/article/details/54293298
空洞卷積
空洞卷積一般都伴有padding,如果dilation=6,那么padding也等于6。通過空洞卷積后的卷積特征圖的大小不變,但是這個卷積的感受野比普通同等大小的卷積大。不過通道數(shù)是可以改變的。
在DeepLabv3+中,最后的ASPP層,通過一個1x1卷積和3個3x3的空洞卷積,再concat上一個經(jīng)過全局平均池化后雙線性采樣到同等維度的特征圖。
但是要注意,由于空洞卷積本身不會增大運算量,但是后續(xù)的分辨率沒有減小,后面的計算量就間接變大了。https://zhuanlan.zhihu.com/p/52476083
數(shù)據(jù)不好怎么辦,數(shù)據(jù)不均衡怎么處理、只有少量帶標(biāo)簽怎么處理
具體問題具體分析。
訓(xùn)練過程中需要過擬合情況怎么辦
深度學(xué)習(xí)-通用模型調(diào)試技巧
如何根據(jù)訓(xùn)練/驗證損失曲線診斷我們的CNN
關(guān)于訓(xùn)練神經(jīng)網(wǎng)路的諸多技巧Tricks(完全總結(jié)版)
深度學(xué)習(xí)中數(shù)據(jù)集很小是一種什么樣的體驗
如果模型的實際容量比較大,那么可以說模型可以完全學(xué)習(xí)到整個數(shù)據(jù)集,會發(fā)生過擬合。這時候再添加新的數(shù)據(jù)進去,模型的性能會進一步提升,說明模型還沒有被撐死。期望風(fēng)險是模型關(guān)于聯(lián)合分布的期望損失,經(jīng)驗風(fēng)險是模型關(guān)于訓(xùn)練數(shù)據(jù)集的平均損失。根據(jù)大樹定律,當(dāng)樣本容量N趨于無窮時,經(jīng)驗風(fēng)險趨于期望風(fēng)險。但是當(dāng)樣本的容量比較小的的時候,經(jīng)驗風(fēng)險最小化學(xué)習(xí)的效果未必就會很好,會產(chǎn)生“過擬合”的現(xiàn)象。結(jié)構(gòu)風(fēng)險最小化是為了防止過擬合而提出的策略。
https://lilianweng.github.io/lil-log/2019/03/14/are-deep-neural-networks-dramatically-overfitted.html?
https://www.jianshu.com/p/97aafe479fa1?(重要)
正則化
在Pytorch中只能在optim中設(shè)置weight_decay,目前只支持L2正則,而且這個正則是針對模型中所有的參數(shù),不論是w還是b,也包括BN中的W和b。
BN層和L2正則化一起有什么后果
就是因為 batch norm 過后, weight 影響沒那么重了,所以 l2 weight decay 的效果就不明顯了。證明了L2正則化與歸一化相結(jié)合時沒有正則化效應(yīng)。相反,正則化會影響權(quán)重的范圍,從而影響有效學(xué)習(xí)率。
https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral
ROIPooling和ROIAlign的區(qū)別
空間金字塔池化(SSP)可以使不同尺寸的圖像產(chǎn)生固定的輸出維度。借題也問個問題,為什么fast rcnn的roi pooling是一個max pooling呢?roi pooling后面也是做單個roi的classification,為啥不和classification的pooling不同?我直覺是看feature map中的一個channel,提取全局特征(如,做classification)用average pooling,提取提取全局信息;提取局部特征(如,roi pooling)應(yīng)該用max pooling,提取局部最明顯的特征,成為7×7的grid后交給后面的fc來做classification。相關(guān)介紹:
SPPNet-引入空間金字塔池化改進RCNN
自己實現(xiàn)圖像增強算法
https://zhuanlan.zhihu.com/p/71231560
圖像分類的tricks
亞馬遜:用CNN進行圖像分類的Tricks(https://mp.weixin.qq.com/s/e4m_LhtqoUiGJMQfEZHcRA)
消融實驗(Ablation experiment)
因為作者提出了一種方案,同時改變了多個條件/參數(shù),他在接下去的消融實驗中,會一一控制一個條件/參數(shù)不變,來看看結(jié)果,到底是哪個條件/參數(shù)對結(jié)果的影響更大。下面這段話摘自知乎,@人民藝術(shù)家:你朋友說你今天的樣子很帥,你想知道發(fā)型、上衣和褲子分別起了多大的作用,于是你換了幾個發(fā)型,你朋友說還是挺帥的,你又換了件上衣,你朋友說不帥了,看來這件衣服還挺重要的。
手?jǐn)]NMS與soft-NMS
https://oldpan.me/archives/write-hard-nms-c
邏輯回歸和線性回歸
線性回歸:通過均方誤差來尋找最優(yōu)的參數(shù),然后通過最小二乘法來或者梯度下降法估計:
而邏輯回歸的原型:對數(shù)幾率回歸:邏輯回歸和對數(shù)幾率回歸是一樣的,通過變形就可以得到,另外邏輯回歸使用極大似然概率進行估計。簡單總結(jié):
線性回歸和邏輯回歸都是廣義線性回歸模型的特例
線性回歸只能用于回歸問題,邏輯回歸用于分類問題(可由二分類推廣至多分類)
線性回歸無聯(lián)系函數(shù)或不起作用,邏輯回歸的聯(lián)系函數(shù)是對數(shù)幾率函數(shù),屬于Sigmoid函數(shù)
線性回歸使用最小二乘法作為參數(shù)估計方法,邏輯回歸使用極大似然法作為參數(shù)估計方法
兩者都可以使用梯度下降法
注意:
線性回歸的梯度下降法其實和我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)一直,首先需要對參數(shù)進行初始化,然后使用隨機梯度下降的方式對參數(shù)進行更新//zhuanlan.zhihu.com/p/33992985
線性回歸與最小二乘法:https://zhuanlan.zhihu.com/p/36910496
最大似然?https://zhuanlan.zhihu.com/p/33349381
來源文章:
https://segmentfault.com/a/1190000014807779
https://zhuanlan.zhihu.com/p/39363869
https://blog.csdn.net/hahaha_2017/article/details/81066673
對于凸函數(shù)來說,局部最優(yōu)就是全局最優(yōu),相關(guān)鏈接:http://sofasofa.io/forum_main_post.php?postid=1000329?
http://sofasofa.io/forum_main_post.php?postid=1000322Logistic classification with cross-entropy
什么是attention,有哪幾種
https://zhuanlan.zhihu.com/p/61440116?
https://www.zhihu.com/question/65044831/answer/227262160
深度學(xué)習(xí)的線性和非線性
卷積是線性的
激活函數(shù)是非線性的
梯度消失和梯度爆炸的問題
Batch-norm層的作用
不看必進坑~不論是訓(xùn)練還是部署都會讓你踩坑的Batch Normalization
Batch size過小會使Loss曲線振蕩的比較大,大小一般按照2的次冪規(guī)律選擇,至于為什么?沒有答出來,面試官后面解釋是為了硬件計算效率考慮的,海哥后來也說GPU訓(xùn)練的時候開的線程是2的次冪個神經(jīng)網(wǎng)絡(luò)的本質(zhì)是學(xué)習(xí)數(shù)據(jù)的分布,如果訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)的分布不同則會大大降低網(wǎng)絡(luò)的泛化能力。隨著網(wǎng)絡(luò)訓(xùn)練的進行,每個隱層的變化使得后一層的輸入發(fā)生變化,從而每一批訓(xùn)練的數(shù)據(jù)的分布也會變化,致使網(wǎng)絡(luò)在每次迭代過程中都需要擬合不同的數(shù)據(jù)分布,增加數(shù)據(jù)訓(xùn)練的復(fù)雜度和過擬合的風(fēng)險。
對數(shù)據(jù)的劇烈變化有抵抗能力。
要注意BN在卷積網(wǎng)絡(luò)層中,因為參數(shù)的共享機制,每一個卷積核的參數(shù)在不同位置的神經(jīng)元當(dāng)中是共享的,因此也應(yīng)該被歸一化。(具體看一下實現(xiàn)過程)https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/batch_norm_layer.html但是在訓(xùn)練過程中如果batch-size不大的話,可以不使用BN(MaskRcnn這樣說的)。至此,關(guān)于Batch Normalization的理論與實戰(zhàn)部分就介紹道這里??偟膩碚f,BN通過將每一層網(wǎng)絡(luò)的輸入進行normalization,保證輸入分布的均值與方差固定在一定范圍內(nèi),減少了網(wǎng)絡(luò)中的Internal Covariate Shift問題,并在一定程度上緩解了梯度消失,加速了模型收斂;并且BN使得網(wǎng)絡(luò)對參數(shù)、激活函數(shù)更加具有魯棒性,降低了神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練和調(diào)參的復(fù)雜度;最后BN訓(xùn)練過程中由于使用mini-batch的mean/variance作為總體樣本統(tǒng)計量估計,引入了隨機噪聲,在一定程度上對模型起到了正則化的效果。
https://zhuanlan.zhihu.com/p/34879333
BN與貝葉斯的關(guān)系:
從Bayesian角度淺析Batch Normalization
BN跨卡訓(xùn)練怎么保證相同的mean和var
在實踐中,我發(fā)現(xiàn),跨卡同步的BN對于performance相當(dāng)有用。尤其是對于detection,segmentation任務(wù),本來Batch size較小。如果Batch Norm能跨卡同步的話,就相當(dāng)于增大了Batch Norm的batch size 這樣能估計更加準(zhǔn)確的mean和variance,所以這個操作能提升performance。
如何實現(xiàn)SyncBN
跨卡同步BN的關(guān)鍵是在前向運算的時候拿到全局的均值和方差,在后向運算時候得到相應(yīng)的全局梯度。最簡單的實現(xiàn)方法是先同步求均值,再發(fā)回各卡然后同步求方差,但是這樣就同步了兩次。實際上只需要同步一次就可以,我們使用了一個非常簡單的技巧,改變方差的公式(公式是圖片,具體大家自己網(wǎng)上搜一下SyncBN)。這樣在前向運算的時候,我們只需要在各卡上算出與,再跨卡求出全局的和即可得到正確的均值和方差, 同理我們在后向運算的時候只需同步一次,求出相應(yīng)的梯度與。我們在最近的論文Context Encoding for Semantic Segmentation 里面也分享了這種同步一次的方法。有了跨卡BN我們就不用擔(dān)心模型過大用多卡影響收斂效果了,因為不管用多少張卡只要全局的批量大小一樣,都會得到相同的效果。
ResNet為什么好用
出現(xiàn)因素:
隨著網(wǎng)絡(luò)的加深,優(yōu)化函數(shù)越來越陷入局部最優(yōu)解
隨著網(wǎng)絡(luò)層數(shù)的增加,梯度消失的問題更加嚴(yán)重,因為梯度在反向傳播的時候會逐漸衰減
原因,誤差傳播公式可以寫成參數(shù)W和導(dǎo)數(shù)F連乘的形式,當(dāng)誤差由第L層傳播到輸入以外的第一個隱含層的時候,會涉及到很多很多的參數(shù)和導(dǎo)數(shù)的連乘,這時誤差很容易產(chǎn)生消失或者膨脹,導(dǎo)致不容易學(xué)習(xí),擬合能力和泛化能力較差。殘差層中的F層只需要擬合輸入x與目標(biāo)輸出H的殘差H-x即可,如果某一層的輸出已經(jīng)較好地擬合了期望結(jié)果,那么多一層也不回使得模型變得更差,因為該層的輸出直接被短接到兩層之后,相當(dāng)于直接學(xué)習(xí)了一個恒等映射,而跳過的兩層只需要擬合上層輸出和目標(biāo)之間的殘差即可。
https://zhuanlan.zhihu.com/p/42706477
https://zhuanlan.zhihu.com/p/31852747
Resnet的缺點
resnet其實無法真正的實現(xiàn)梯度消失,這里面有很強的先驗假設(shè),并且resnet真正起作用的層只在中間,深層作用比較小(到了深層就是恒等映射了),feature存在利用不足的現(xiàn)象,add的方式阻礙了梯度和信息的流通。
L1范數(shù)和L2范數(shù) 應(yīng)用場景
L1正則可以使少數(shù)權(quán)值較大,多數(shù)權(quán)值為0,得到稀疏的權(quán)值;L2正則會使權(quán)值都趨近于0但非零,得到平滑的權(quán)值;https://zhuanlan.zhihu.com/p/35356992
網(wǎng)絡(luò)初始化有哪些方式,他們的公式初始化過程
目前的權(quán)重初始化分為三類:
全置為0 - 幾乎不會使用
隨機初始化(均勻隨機、正態(tài)分布)
Xavier 作者 Glorot 認(rèn)為,優(yōu)秀的初始化應(yīng)該使得各層的激活值和狀態(tài)梯度的方差在傳播過程中保持一致。適合sigmoid,但是不適合Relu。
He初始化適用于Relu。
初始化,說白了就是構(gòu)建一個平滑的局部幾何空間從而使得優(yōu)化更簡單xavier分布解析:
https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/
假設(shè)使用的是sigmoid函數(shù)。當(dāng)權(quán)重值(值指的是絕對值)過小,輸入值每經(jīng)過網(wǎng)絡(luò)層,方差都會減少,每一層的加權(quán)和很小,在sigmoid函數(shù)0附件的區(qū)域相當(dāng)于線性函數(shù),失去了DNN的非線性性。當(dāng)權(quán)重的值過大,輸入值經(jīng)過每一層后方差會迅速上升,每層的輸出值將會很大,此時每層的梯度將會趨近于0. xavier初始化可以使得輸入值x 方差經(jīng)過網(wǎng)絡(luò)層后的輸出值y方差不變。
https://blog.csdn.net/winycg/article/details/86649832
https://zhuanlan.zhihu.com/p/57454669
在pytorch中默認(rèn)的權(quán)重初始化方式是何凱明的那個,舉個例子:
resnet中權(quán)重的初始化
?
?
?
?
求解模型參數(shù)量
?
?
?
?
卷積計算量
差不多這幾個懂了就OK。
普通卷積
可分離卷積
全連接
點卷積
可以看老潘的這篇文章:
你的模型能跑多快???
多標(biāo)簽和多分類
那么,如何用softmax和sigmoid來做多類分類和多標(biāo)簽分類呢?
1、如何用softmax做多分類和多標(biāo)簽分類 現(xiàn)假設(shè),神經(jīng)網(wǎng)絡(luò)模型最后的輸出是這樣一個向量logits=[1,2,3,4], 就是神經(jīng)網(wǎng)絡(luò)最終的全連接的輸出。這里假設(shè)總共有4個分類。用softmax做多分類的方法:?tf.argmax(tf.softmax(logits))首先用softmax將logits轉(zhuǎn)換成一個概率分布,然后取概率值最大的作為樣本的分類,這樣看似乎,tf.argmax(logits)同樣可以取得最大的值,也能得到正確的樣本分類,這樣的話softmax似乎作用不大.那么softmax的主要作用其實是在計算交叉熵上,首先樣本集中y是一個one-hot向量,如果直接將模型輸出logits和y來計算交叉熵,因為logits=[1,2,3,4],計算出來的交叉熵肯定很大,這種計算方式不對,而應(yīng)該將logits轉(zhuǎn)換成一個概率分布后再來計算,就是用tf.softmax(logits)和y來計算交叉熵,當(dāng)然我們也可以直接用tensorflow提供的方法sofmax_cross_entropy_with_logits來計算 這個方法傳入的參數(shù)可以直接是logits,因為這個根據(jù)方法的名字可以看到,方法內(nèi)部會將參數(shù)用softmax進行處理,現(xiàn)在我們?nèi)〉母怕史植贾凶畲蟮淖鳛樽罱K的分類結(jié)果,這是多分類。我們也可以取概率的top幾個,作為最終的多個標(biāo)簽,或者設(shè)置一個閾值,并取大于概率閾值的。這就用softmax實現(xiàn)了多標(biāo)簽分類。
2、如何用sigmoid做多標(biāo)簽分類 sigmoid一般不用來做多類分類,而是用來做二分類的,它是將一個標(biāo)量數(shù)字轉(zhuǎn)換到[0,1]之間,如果大于一個概率閾值(一般是0.5),則認(rèn)為屬于某個類別,否則不屬于某個類別。那么如何用sigmoid來做多標(biāo)簽分類呢?其實就是針對logits中每個分類計算的結(jié)果分別作用一個sigmoid分類器,分別判定樣本是否屬于某個類別。同樣假設(shè),神經(jīng)網(wǎng)絡(luò)模型最后的輸出是這樣一個向量logits=[1,2,3,4], 就是神經(jīng)網(wǎng)絡(luò)最終的全連接的輸出。這里假設(shè)總共有4個分類。tf.sigmoid(logits)sigmoid應(yīng)該會將logits中每個數(shù)字都變成[0,1]之間的概率值,假設(shè)結(jié)果為[0.01, 0.05, 0.4, 0.6],然后設(shè)置一個概率閾值,比如0.3,如果概率值大于0.3,則判定類別符合,那這里,樣本會被判定為類別3和類別4都符合。
數(shù)據(jù)的輸入為什么要歸一化
為了消除數(shù)據(jù)特征之間的量綱影響在實際應(yīng)用中,通過梯度下降法求解的模型通常是需要數(shù)據(jù)歸一化的,包括線性回歸、邏輯回歸、支持向量機、神經(jīng)網(wǎng)絡(luò)等,但是決策模型不是很適用。
為什么說樸素貝葉斯是高偏差低方差?
首先,假設(shè)你知道訓(xùn)練集和測試集的關(guān)系。簡單來講是我們要在訓(xùn)練集上學(xué)習(xí)一個模型,然后拿到測試集去用,效果好不好要根據(jù)測試集的錯誤率來衡量。但很多時候,我們只能假設(shè)測試集和訓(xùn)練集的是符合同一個數(shù)據(jù)分布的,但卻拿不到真正的測試數(shù)據(jù)。這時候怎么在只看到訓(xùn)練錯誤率的情況下,去衡量測試錯誤率呢?
由于訓(xùn)練樣本很少(至少不足夠多),所以通過訓(xùn)練集得到的模型,總不是真正正確的。(就算在訓(xùn)練集上正確率100%,也不能說明它刻畫了真實的數(shù)據(jù)分布,要知道刻畫真實的數(shù)據(jù)分布才是我們的目的,而不是只刻畫訓(xùn)練集的有限的數(shù)據(jù)點)。而且,實際中,訓(xùn)練樣本往往還有一定的噪音誤差,所以如果太追求在訓(xùn)練集上的完美而采用一個很復(fù)雜的模型,會使得模型把訓(xùn)練集里面的誤差都當(dāng)成了真實的數(shù)據(jù)分布特征,從而得到錯誤的數(shù)據(jù)分布估計。這樣的話,到了真正的測試集上就錯的一塌糊涂了(這種現(xiàn)象叫過擬合)。但是也不能用太簡單的模型,否則在數(shù)據(jù)分布比較復(fù)雜的時候,模型就不足以刻畫數(shù)據(jù)分布了(體現(xiàn)為連在訓(xùn)練集上的錯誤率都很高,這種現(xiàn)象較欠擬合)。過擬合表明采用的模型比真實的數(shù)據(jù)分布更復(fù)雜,而欠擬合表示采用的模型比真實的數(shù)據(jù)分布要簡單。
在統(tǒng)計學(xué)習(xí)框架下,大家刻畫模型復(fù)雜度的時候,有這么個觀點,認(rèn)為Error = Bias + Variance。這里的Error大概可以理解為模型的預(yù)測錯誤率,是有兩部分組成的,一部分是由于模型太簡單而帶來的估計不準(zhǔn)確的部分(Bias),另一部分是由于模型太復(fù)雜而帶來的更大的變化空間和不確定性(Variance)。
所以,這樣就容易分析樸素貝葉斯了。它簡單的假設(shè)了各個數(shù)據(jù)之間是無關(guān)的,是一個被嚴(yán)重簡化了的模型。所以,對于這樣一個簡單模型,大部分場合都會Bias部分大于Variance部分,也就是說高偏差而低方差。
在實際中,為了讓Error盡量小,我們在選擇模型的時候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。
Canny邊緣檢測,邊界檢測算法有哪些
https://zhuanlan.zhihu.com/p/42122107?
https://zhuanlan.zhihu.com/p/59640437
傳統(tǒng)的目標(biāo)檢測
傳統(tǒng)的目標(biāo)檢測一般分為以下幾個步驟:
區(qū)域選擇:一幅圖像通過selective search的方法,首先對原圖進行分割(聚類),然后通過計算相鄰區(qū)域的相似度,最終找到2000個框,同樣要與GT進行正例和負(fù)例的判斷。
特征提取:通過SIFT或者其他的特征提取方法,將2000個轉(zhuǎn)化為特征向量
分類器分類:將特征向量放入SVM中進行分類訓(xùn)練,同時將父類也放入分類器中進行訓(xùn)練。
經(jīng)典的結(jié)構(gòu):
HoG + SVM
傳統(tǒng)方法的缺點:
基于滑窗的區(qū)域選擇策略沒有針對性,時間復(fù)雜度高,窗口冗余
手工設(shè)計的特征對環(huán)境多樣性的變化并沒有很好的魯棒性
腐蝕膨脹、開運算閉運算
可以看學(xué)習(xí)OpenCV第三版中的相關(guān)內(nèi)容,搜索erode、dilation
一些濾波器
https://blog.csdn.net/qq_22904277/article/details/53316415
https://www.jianshu.com/p/fbe8c24af108
https://blog.csdn.net/qq_22904277/article/details/53316415
https://blog.csdn.net/nima1994/article/details/79776802
https://blog.csdn.net/jiang_ming_/article/details/82594261
圖像中的高頻、低頻信息以及高通濾波器、低通濾波器
在圖像中,邊緣信息等比較明顯的變化比較劇烈的像素點就是圖像中的高頻信息。而除了邊緣部分,比較平緩的像素點變化不是很劇烈的內(nèi)容信息就是低頻信息。
高通濾波器就是突出變化劇烈(邊緣),去除低頻部分,也就是當(dāng)做邊緣提取器。而低通濾波器主要是平滑該像素的亮度。主要用于去噪和模糊化,高斯模糊是最常用的模糊濾波器(平滑濾波器)之一,它是一個削弱高頻信號強度的低通濾波器。
Resize雙線性插值
在網(wǎng)絡(luò)結(jié)構(gòu)進行特征融合的時候,雙線性插值的方式比轉(zhuǎn)置卷積要好一點。因為轉(zhuǎn)置卷積有一個比較大的問題就是如果參數(shù)配置不當(dāng),很容易出現(xiàn)輸出feature map中帶有明顯棋盤狀的現(xiàn)象。
需要注意的,最近鄰插值的效果是最不好的。
雙線性插值也分為兩類:
align_corners=True
align_corners=False
一般來說,使用align_corners=True可以保證邊緣對齊,而使用align_corners=False則會導(dǎo)致邊緣突出的情況。這個講的非常好:
https://blog.csdn.net/qq_37577735/article/details/80041586
代碼實現(xiàn)的講解:
https://blog.csdn.net/love_image_xie/article/details/87969405
https://www.zhihu.com/question/328891283/answer/717113611?看這里的圖像展示:https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663
gradient clipping 梯度裁剪
為了避免梯度爆炸而做出的改進,注意要和提前終止區(qū)別開來。(提前終止是一種正則化方法,因為當(dāng)訓(xùn)練有足夠能力表示甚至?xí)^擬合的大模型時,訓(xùn)練誤差會隨著時間的推移逐漸降低但驗證集的誤差會再次上升。這意味著只要我們返回使驗證集誤差最低的參數(shù)設(shè)置即可)第一種做法很容易理解,就是先設(shè)定一個 gradient 的范圍如 (-1, 1), 小于 -1 的 gradient 設(shè)為 -1, 大于這個 1 的 gradient 設(shè)為 1.
https://wulc.me/2018/05/01/%E6%A2%AF%E5%BA%A6%E8%A3%81%E5%89%AA%E5%8F%8A%E5%85%B6%E4%BD%9C%E7%94%A8/
實現(xiàn)一個簡單的卷積
實現(xiàn)卷積一般用的是im2col的形式,但是面試中我們簡單實現(xiàn)一個滑窗法就行了。比如:用3x3的卷積核(濾波盒)實現(xiàn)卷積操作。NCNN中在PC端卷積的源碼也是這樣的。
?
?
?
?
參考:
https://www.cnblogs.com/hejunlin1992/p/8686838.html
卷積的過程
看看Pytorch的源碼與caffe的源碼,都是將卷積計算轉(zhuǎn)化為矩陣運算,im2col,然后gemm。https://blog.csdn.net/mrhiuser/article/details/52672824
轉(zhuǎn)置卷積的計算過程
https://cloud.tencent.com/developer/article/1363619
1*1的卷積核有什么用,3*3的卷積核和一個1*3加一個3*1的有什么區(qū)別
1x1卷積可以改變上一層網(wǎng)絡(luò)的通道數(shù)目。卷積核大于1x1,意味著提特征需要鄰域信息。
若提取橫向紋理,則橫向鄰域信息密度比縱向信息密度高。
核扁橫著最科學(xué)。若提縱向紋理,同理,瘦高豎著最好。
若你想提取的紋理種類豐富,那橫向鄰域信息密度的期望~=縱向信息密度期望
所以對懶人來說,最優(yōu)核的尺寸的期望是正方形。至于1*n和n*1,它們一般是搭配使用的,從而實現(xiàn)n*n卷積核的感受野,可以在減少參數(shù)的同時增加層數(shù),在CNN的較高層中使用可以帶來一定的優(yōu)勢。卷積核并非都是正方形的,還可以是矩形,比如3*5,在文本檢測和車牌檢測當(dāng)中就有應(yīng)用,這種設(shè)計主要針對文本行或者車牌的形狀,能更好的學(xué)習(xí)特征。其實我覺得方形矩形影響不大,網(wǎng)絡(luò)的學(xué)習(xí)能力是非常強的。當(dāng)然我們也可以學(xué)習(xí)卷積的形狀,類似于deformable convolution,老潘后續(xù)會講下。
ResNet中bottlenet與mobilenetv2的inverted結(jié)構(gòu)對比
注意,resnet中是先降維再升維,而mobilenetv2中是先升維后降維(所以稱之為inversed)。
https://zhuanlan.zhihu.com/p/67872001
https://zhuanlan.zhihu.com/p/32913695
卷積特征圖大小的計算
很簡單但是也很容易錯的問題:
Conv2D
動態(tài)圖和靜態(tài)圖的區(qū)別
靜態(tài)圖是建立一次,然后不斷復(fù)用;靜態(tài)圖可以在磁盤中序列化,可以保存整個網(wǎng)絡(luò)的結(jié)構(gòu),可以重載,在部署中很實用,在tensorflow靜態(tài)圖中條件和循環(huán)需要特定的語法,pytorch只用python的語法就可以實現(xiàn)
而動態(tài)圖是每次使用的時候建立,不容易優(yōu)化,需要重復(fù)之前的代碼,但是動態(tài)圖比靜態(tài)圖代碼更簡潔
依據(jù)采用動態(tài)計算或是靜態(tài)計算的不同,可以將這些眾多的深度學(xué)習(xí)框架劃分成兩大陣營,當(dāng)然也有些框架同時具有動態(tài)計算和靜態(tài)計算兩種機制(比如 MxNet 和最新的 TensorFlow)。動態(tài)計算意味著程序?qū)凑瘴覀兙帉懨畹捻樞蜻M行執(zhí)行。這種機制將使得調(diào)試更加容易,并且也使得我們將大腦中的想法轉(zhuǎn)化為實際代碼變得更加容易。而靜態(tài)計算則意味著程序在編譯執(zhí)行時將先生成神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),然后再執(zhí)行相應(yīng)操作。從理論上講,靜態(tài)計算這樣的機制允許編譯器進行更大程度的優(yōu)化,但是這也意味著你所期望的程序與編譯器實際執(zhí)行之間存在著更多的代溝。這也意味著,代碼中的錯誤將更加難以發(fā)現(xiàn)(比如,如果計算圖的結(jié)構(gòu)出現(xiàn)問題,你可能只有在代碼執(zhí)行到相應(yīng)操作的時候才能發(fā)現(xiàn)它)。盡管理論上而言,靜態(tài)計算圖比動態(tài)計算圖具有更好的性能,但是在實踐中我們經(jīng)常發(fā)現(xiàn)并不是這樣的。
歷年來所有的網(wǎng)絡(luò)
這個可以看CS231n中的第九課以及
https://ucbrise.github.io/cs294-ai-sys-sp19/assets/lectures/lec02/classic_neural_architectures.pdf
https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202
正式總結(jié)下:
LeNet-5:第一個卷積,用來識別手寫數(shù)組,使用的卷積大小為5x5,s=1,就是普通的卷積核池化層結(jié)合起來,最后加上全連接層。
AlexNet:在第一個卷積中使用了11x11卷積,第一次使用Relu,使用了NormLayer但不是我們經(jīng)常說的BN。使用了dropout,在兩個GPU上進行了訓(xùn)練,使用的訓(xùn)練方式是模型并行、
ZFNet:AlexNet的加強版,將11x11卷積改成了7x7,也在AlexNet的基礎(chǔ)上將卷積的通道深度加深。所以在分類比賽中比之前的效果好了些。
VGGNet:只使用了小卷積3x3(s=1)以及常規(guī)的池化層,不過深度比上一個深了一些,最后幾層也都是全連接層接一個softmax。為什么使用3x3卷積,是因為三個3x3卷積的有效感受野和7x7的感受野一致,而且更深、更加非線性,而且卷積層的參數(shù)也更加地少,所以速度更快也可以適當(dāng)加深層數(shù)。
GoogleNet:沒有使用FC層,參數(shù)量相比之前的大大減少,提出了Inception module結(jié)構(gòu),也就是NIN結(jié)構(gòu)(network within a network)。但是原始的Inception module計算量非常大,所以在每一個分支加了1x1 conv "bottleneck"結(jié)構(gòu)(具體細(xì)節(jié)看圖)。googlenet網(wǎng)絡(luò)結(jié)構(gòu)中為了避免梯度消失,在中間的兩個位置加了兩個softmax損失,所以會有三個loss,整個網(wǎng)絡(luò)的loss是通過三個loss乘上權(quán)重相加后得到 相關(guān)文章:https://zhuanlan.zhihu.com/p/42704781 inception結(jié)構(gòu)的特點:1、增加了網(wǎng)絡(luò)的寬度,同時也提高了對于不同尺度的適應(yīng)程度。2、使用 1x1 卷積核對輸入的特征圖進行降維處理,這樣就會極大地減少參數(shù)量,從而減少計算量。3、在V3中使用了多個小卷積核代替大卷積核的方法,除了規(guī)整的的正方形,我們還有分解版本的 3x3 = 3x1 + 1x3,這個效果在深度較深的情況下比規(guī)整的卷積核更好。4、發(fā)明了Bottleneck 的核心思想還是利用多個小卷積核替代一個大卷積核,利用 1x1 卷積核替代大的卷積核的一部分工作。也就是先1x1降低通道然后普通3x3然后再1x1回去。
Xception:改進了inception,提出的?depthwise Separable Conv?讓人眼前一亮。https://www.jianshu.com/p/4708a09c4352
ResNet:越深的網(wǎng)絡(luò)越難進行優(yōu)化,有一個特點需要搞明白,越深的層最起碼表現(xiàn)應(yīng)該和淺層的一樣,不能比淺層的還差。對于更深的Resnet(50+),這里采用bottleneck層(也就是兩個1x1分別降維和升維)去提升網(wǎng)絡(luò)的效率。更詳細(xì)的描述可以看百面機器學(xué)習(xí)和ppt。相關(guān)講解:https://zhuanlan.zhihu.com/p/42706477
DenseNet 不能簡單說densenet更好,二者比較,ResNet是更一般的模型,DenseNet是更特化的模型。DenseNet用于圖像處理可能比ResNet表現(xiàn)更好,本質(zhì)是DenseNet更能和圖像的信息分布特點匹配,是使用了多尺度的Kernel。但是也有缺點最直接的計算就是一次推斷中所產(chǎn)生的所有feature map數(shù)目。有些框架會有優(yōu)化,自動把比較靠前的層的feature map釋放掉,所以顯存就會減少,或者inplace操作通過重新計算的方法減少一部分顯存,但是densenet因為需要重復(fù)利用比較靠前的feature map,所以無法釋放,導(dǎo)致顯存占用過大。正是這種_concat_造成densenet能更密集的連接。
SeNet:全稱為Squeeze-and-Excitation Networks。屬于注意力特征提取的范疇,加了GP(Global pooling)和兩個FC再加上sigmoid和scale。也就是生成注意力掩膜,去乘以輸入的x得到新的x。核心思想就是去學(xué)習(xí)每個特征通道的重要程度,然后根據(jù)這個重要程度去提升有用的特征并抑制對當(dāng)前任務(wù)用處不大的特征。這個給每一個特征層通道去乘以通過sigmoid得到的重要系數(shù),其實和用bn層去觀察哪個系數(shù)重要一樣。缺點:由于在主干上存在 0~1 的 scale 操作,在網(wǎng)絡(luò)較深 BP 優(yōu)化時就會在靠近輸入層容易出現(xiàn)梯度消散的情況,導(dǎo)致模型難以優(yōu)化。http://www.sohu.com/a/161633191_465975
Wide Residual Networks
ResNeXt:是resnet和inception的結(jié)合體,旁邊的residual connection就是公式中的x直接連過來,然后剩下的是32組獨立的同樣結(jié)構(gòu)的變換,最后再進行融合,符合split-transform-merge的模式。雖然分了32組,都是先點卷積降維,然后3x3普通卷積,然后1x1卷積升維(與Mobilenetv2中的相反) 相關(guān)介紹:https://zhuanlan.zhihu.com/p/51075096
Densely Connected Convolutional Networks:有利于減輕梯度消失的情況,增強了特征的流動。
shufflenet:https://blog.csdn.net/u011974639/article/details/79200559
一些統(tǒng)計知識
正太分布:https://blog.csdn.net/yaningli/article/details/78051361
關(guān)于如何訓(xùn)練(訓(xùn)練過程中的一些問題)
MaxPool導(dǎo)致的訓(xùn)練震蕩(通過在MaxPool之后加上L2Norm)//mp.weixin.qq.com/s/QR-KzLxOBazSbEFYoP334Q
全連接層的好伴侶:空間金字塔池化(SPP)
https://zhuanlan.zhihu.com/p/64510297
感受野計算
感受野計算有兩個公式,一個普通公式一個通項公式:
需要注意,卷積和池化都可以增加感受野。
審核編輯:黃飛
?
`def gaussian_2d_kernel(kernel_size = 3,sigma = 0):
kernel = np.zeros([kernel_size,kernel_size])
center = kernel_size // 2
if sigma == 0:
sigma = ((kernel_size-1)*0.5 - 1)*0.3 + 0.8
s = 2*(sigma**2)
sum_val = 0
for i in range(0,kernel_size):
for j in range(0,kernel_size):
x = i-center
y = j-center
kernel[i,j] = np.exp(-(x**2+y**2) / s)
sum_val += kernel[i,j]
#/(np.pi * s)
sum_val = 1/sum_val
return kernel*sum_val
`
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
# Zero-initialize the last BN in each residual branch,
# so that the residual branch starts with zeros, and each residual block behaves like an identity.
# This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
if zero_init_residual:
for m in self.modules():
if isinstance(m, Bottleneck):
nn.init.constant_(m.bn3.weight, 0)
elif isinstance(m, BasicBlock):
nn.init.constant_(m.bn2.weight, 0)
def model_info(model): # Plots a line-by-line description of a PyTorch model
n_p = sum(x.numel() for x in model.parameters()) # number parameters
n_g = sum(x.numel() for x in model.parameters() if x.requires_grad) # number gradients
print('
%5s %50s %9s %12s %20s %12s %12s' % ('layer', 'name', 'gradient', 'parameters', 'shape', 'mu', 'sigma'))
for i, (name, p) in enumerate(model.named_parameters()):
name = name.replace('module_list.', '')
print('%5g %50s %9s %12g %20s %12.3g %12.3g' % (
i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std()))
print('Model Summary: %d layers, %d parameters, %d gradients' % (i + 1, n_p, n_g))
????print('Model?Size:?%f?MB?parameters,?%f?MB?gradients
'?%?(n_p*4/1e6,?n_g*4/1e6))
`/*
輸入:imput[IC][IH][IW]
IC = input.channels
IH = input.height
IW = input.width
卷積核: kernel[KC1][KC2][KH][KW]
KC1 = OC
KC2 = IC
KH = kernel.height
KW = kernel.width
輸出:output[OC][OH][OW]
OC = output.channels
OH = output.height
OW = output.width
其中,padding = VALID,stride=1,
OH = IH - KH + 1
OW = IW - KW + 1
也就是先提前把Oh和Ow算出來,然后將卷積核和輸入數(shù)據(jù)一一對應(yīng)即可
*/
for(int ch=0;ch
評論
查看更多