導(dǎo)讀
本文總結(jié)了一些秋招面試中會(huì)遇到的問題和一些重要的知識(shí)點(diǎn),適合面試前突擊和鞏固基礎(chǔ)知識(shí)。
前言
最近這段時(shí)間正臨秋招,這篇文章是老潘在那會(huì)找工作過程中整理的一些重要知識(shí)點(diǎn),內(nèi)容比較雜碎,部分采集于網(wǎng)絡(luò),簡單整理下發(fā)出來,適合面試前突擊,當(dāng)然也適合鞏固基礎(chǔ)知識(shí)。另外推薦大家一本叫做《百面機(jī)器學(xué)習(xí)》的新書,2018年8月份出版的,其中包括了很多機(jī)器學(xué)習(xí)、深度學(xué)習(xí)面試過程中會(huì)遇到的問題,比較適合需要準(zhǔn)備面試的機(jī)器學(xué)習(xí)、深度學(xué)習(xí)方面的算法工程師,當(dāng)然也同樣適合鞏固基礎(chǔ)~有時(shí)間一定要需要看的書籍:
- 程序員的數(shù)學(xué)系列,適合重溫知識(shí),回顧一些基礎(chǔ)的線性代數(shù)、概率論。
- 深度學(xué)習(xí)花書,總結(jié)類書,有基礎(chǔ)知識(shí)的講解,比較全面。
- 統(tǒng)計(jì)學(xué)習(xí)方法,總結(jié)類書,篇幅不長,都是核心。
- Pattern Recognition and Machine Learning,條理清晰,用貝葉斯的方式來講解機(jī)器學(xué)習(xí)。
- 機(jī)器學(xué)習(xí)西瓜書,適合當(dāng)教材,內(nèi)容較廣但是不深。
常見的常識(shí)題
- L1正則可以使少數(shù)權(quán)值較大,多數(shù)權(quán)值為0,得到稀疏的權(quán)值;L2正則會(huì)使權(quán)值都趨近于0但非零,得到平滑的權(quán)值;
- 在AdaBoost算法中,被錯(cuò)分的樣本的權(quán)重更新比例的公式相同;
- Boosting和Bagging都是組合多個(gè)分類器投票的方法,但Boosting是根據(jù)單個(gè)分類器的正確率決定其權(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是尋找一個(gè)維度,使得原始數(shù)據(jù)在該維度上投影后不同類別的數(shù)據(jù)盡可能分離開來。
PCA是一種正交投影,它的思想是使得原始數(shù)據(jù)在投影子空間的各個(gè)維度的方差最大。假設(shè)我們要將N維的數(shù)據(jù)投影到M維的空間上(M
關(guān)于K近鄰算法的知識(shí)有很多,比如算法執(zhí)行的步驟、應(yīng)用領(lǐng)域以及注意事項(xiàng),不過相信很多人對(duì)K近鄰算法的使用注意事項(xiàng)不是很清楚。在這篇文章中我們針對(duì)這個(gè)問題進(jìn)行解答,帶大家來好好了解一下k近鄰算法的注意事項(xiàng)以及K近鄰算法的優(yōu)點(diǎn)與缺點(diǎn)。
K近鄰算法的使用注意事項(xiàng)具體就是使用距離作為度量時(shí),要保證所有特征在數(shù)值上是一個(gè)數(shù)量級(jí)上,以免距離的計(jì)算被數(shù)量級(jí)大的特征所主導(dǎo)。在數(shù)據(jù)標(biāo)準(zhǔn)化這件事上,還要注意一點(diǎn),訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集一定要使用同一標(biāo)準(zhǔn)的標(biāo)準(zhǔn)化。其中的原因總的來說就有兩點(diǎn)內(nèi)容,第一就是標(biāo)準(zhǔn)化其實(shí)可以視為算法的一部分,既然數(shù)據(jù)集都減去了一個(gè)數(shù),然后除以一個(gè)數(shù),這兩個(gè)數(shù)對(duì)于所有的數(shù)據(jù)來說,就要一視同仁。第二就是訓(xùn)練數(shù)據(jù)集其實(shí)很少,在預(yù)測新樣本的時(shí)候,新樣本就更少得可憐,如果新樣本就一個(gè)數(shù)據(jù),它的均值就是它自己,標(biāo)準(zhǔn)差是0,這根本就不合理。
K近鄰算法的優(yōu)點(diǎn)具體體現(xiàn)在四方面。第一就就是k近鄰算法是一種在線技術(shù),新數(shù)據(jù)可以直接加入數(shù)據(jù)集而不必進(jìn)行重新訓(xùn)練,第二就是k近鄰算法理論簡單,容易實(shí)現(xiàn)。第三就是準(zhǔn)確性高,對(duì)異常值和噪聲有較高的容忍度。第四就是k近鄰算法天生就支持多分類,區(qū)別與感知機(jī)、邏輯回歸、SVM。
K近鄰算法的缺點(diǎn),基本的 k近鄰算法每預(yù)測一個(gè)“點(diǎn)”的分類都會(huì)重新進(jìn)行一次全局運(yùn)算,對(duì)于樣本容量大的數(shù)據(jù)集計(jì)算量比較大。而且K近鄰算法容易導(dǎo)致維度災(zāi)難,在高維空間中計(jì)算距離的時(shí)候,就會(huì)變得非常遠(yuǎn);樣本不平衡時(shí),預(yù)測偏差比較大,k值大小的選擇得依靠經(jīng)驗(yàn)或者交叉驗(yàn)證得到。k的選擇可以使用交叉驗(yàn)證,也可以使用網(wǎng)格搜索。k的值越大,模型的偏差越大,對(duì)噪聲數(shù)據(jù)越不敏感,當(dāng) k的值很大的時(shí)候,可能造成模型欠擬合。k的值越小,模型的方差就會(huì)越大,當(dāng) k的值很小的時(shí)候,就會(huì)造成模型的過擬合。
如果讓你寫一個(gè)高斯模糊的函數(shù),你該怎么寫呢?
kmeans的收斂性?
其實(shí)是這樣的,先分布到n臺(tái)機(jī)器上,要保證k個(gè)初始化相同,經(jīng)過一次迭代后,拿到k*n個(gè)新的mean,放到一臺(tái)新的機(jī)器上,因?yàn)槌跏蓟嗤詍ean的排列相同,然后對(duì)屬于每個(gè)類的n個(gè)mean做加權(quán)平均,再放回每臺(tái)機(jī)器上做下一步迭代。
K值的選擇:
KNN中的K值選取對(duì)分類的結(jié)果影響至關(guān)重要,K值選取的太小,模型太復(fù)雜。K值選取的太大,導(dǎo)致分類模糊。那么K值到底怎么選取呢?有人用Cross Validation,有人用貝葉斯,還有的用bootstrap。而距離度量又是另外一個(gè)問題,比較常用的是選用歐式距離。可是這個(gè)距離真的具有普適性嗎?《模式分類》中指出歐式距離對(duì)平移是敏感的,這點(diǎn)嚴(yán)重影響了判定的結(jié)果。在此必須選用一個(gè)對(duì)已知的變換(比如平移、旋轉(zhuǎn)、尺度變換等)不敏感的距離度量。書中提出了采用切空間距離(tangent distance)來替代傳統(tǒng)的歐氏距離。
有監(jiān)督:
無監(jiān)督:
生成式模型:LDA KNN 混合高斯 貝葉斯 馬爾科夫 深度信念 判別式模型:SVM NN LR CRF CART
邏輯回歸即LR。LR預(yù)測數(shù)據(jù)的時(shí)候,給出的是一個(gè)預(yù)測結(jié)果為正類的概率,這個(gè)概率是通過sigmoid函數(shù)將wTx映射到[0,1]得到的,對(duì)于wTx正的很大時(shí)(可以認(rèn)為離決策邊界很遠(yuǎn)),得到為正類的概率趨近于1;對(duì)于wTx負(fù)的很大時(shí)(可以認(rèn)為離決策邊界很遠(yuǎn)),得到為正類的概率趨近于0。在LR中,跟“與決策邊界距離”扯得上關(guān)系的僅此而已。在參數(shù)w求解過程中完全沒有與決策邊界距離的影子,所有樣本都一視同仁。和感知機(jī)的不同之處在于,LR用到與決策邊界的距離,是用來給預(yù)測結(jié)果一個(gè)可以看得到的置信區(qū)間。感知機(jī)里面沒有這一考慮,只根據(jù)符號(hào)來判斷。而SVM更進(jìn)一步,在參數(shù)的求解過程中,便舍棄了距離決策邊界過遠(yuǎn)的點(diǎn)。LR和感知機(jī)都很容易過擬合,只有SVM加入了L2范數(shù)之后的結(jié)構(gòu)化風(fēng)險(xiǎn)最小化策略才解決了過擬合的問題??偨Y(jié)之:
邏輯回歸只能解決二分類問題,多分類用softmax。相關(guān)參考鏈接
Bagging和Boosting的區(qū)別:
Bagging 是 Bootstrap Aggregating 的簡稱,意思就是再取樣 (Bootstrap) 然后在每個(gè)樣本上訓(xùn)練出來的模型取平均,所以是降低模型的 variance. Bagging 比如 Random Forest 這種先天并行的算法都有這個(gè)效果。Boosting 則是迭代算法,每一次迭代都根據(jù)上一次迭代的預(yù)測結(jié)果對(duì)樣本進(jìn)行加權(quán),所以隨著迭代不斷進(jìn)行,誤差會(huì)越來越小,所以模型的 bias 會(huì)不斷降低High variance 是model過于復(fù)雜overfit,記住太多細(xì)節(jié)noise,受outlier影響很大;high bias是underfit,model過于簡單,cost function不夠好。boosting是把許多弱的分類器組合成一個(gè)強(qiáng)的分類器。弱的分類器bias高,而強(qiáng)的分類器bias低,所以說boosting起到了降低bias的作用。variance不是boosting的主要考慮因素。bagging是對(duì)許多強(qiáng)(甚至過強(qiáng))的分類器求平均。在這里,每個(gè)單獨(dú)的分類器的bias都是低的,平均之后bias依然低;而每個(gè)單獨(dú)的分類器都強(qiáng)到可能產(chǎn)生overfitting的程度,也就是variance高,求平均的操作起到的作用就是降低這個(gè)variance。Bagging算法的代表:RandomForest隨機(jī)森林算法的注意點(diǎn):
咱們機(jī)器學(xué)習(xí)升級(jí)版的隨機(jī)森林章節(jié),我用白板寫了寫這個(gè)公式:p = 1 - (1 - 1/N)^N,其意義是:一個(gè)樣本在一次決策樹生成過程中,被選中作為訓(xùn)練樣本的概率,當(dāng)N足夠大時(shí),約等于63.2%。簡言之,即一個(gè)樣本被選中的概率是63.2%,根據(jù)二項(xiàng)分布的的期望,這意味著大約有63.2%的樣本被選中。即有63.2%的樣本是不重復(fù)的,有36.8%的樣本可能沒有在本次訓(xùn)練樣本集中。隨機(jī)森林是一個(gè)包含多個(gè)決策樹的分類器,并且其輸出的類別是由個(gè)別樹輸出的類別的眾數(shù)而定。隨機(jī)森林的隨機(jī)性體現(xiàn)在每顆樹的訓(xùn)練樣本是隨機(jī)的,樹中每個(gè)節(jié)點(diǎn)的分裂屬性集合也是隨機(jī)選擇確定的。有了這2個(gè)隨機(jī)的保證,隨機(jī)森林就不會(huì)產(chǎn)生過擬合的現(xiàn)象了。隨機(jī)森林是用一種隨機(jī)的方式建立的一個(gè)森林,森林是由很多棵決策樹組成的,每棵樹所分配的訓(xùn)練樣本是隨機(jī)的,樹中每個(gè)節(jié)點(diǎn)的分裂屬性集合也是隨機(jī)選擇確定的。
相關(guān)的notebook除了cs231n也可以看這里。
面試見得比較少,感興趣的可以看下:
降采樣是手段不是目的:
降采樣的理論意義,我簡單朗讀一下,它可以增加對(duì)輸入圖像的一些小擾動(dòng)的魯棒性,比如圖像平移,旋轉(zhuǎn)等,減少過擬合的風(fēng)險(xiǎn),降低運(yùn)算量,和增加感受野的大小。相關(guān)鏈接:為什么深度學(xué)習(xí)中的圖像分割要先編碼再解碼?
最大池化提取邊緣等“最重要”的特征,而平均池化提取的特征更加smoothly。對(duì)于圖像數(shù)據(jù),你可以看到差異。雖然兩者都是出于同樣的原因使用,但我認(rèn)為max pooling更適合提取極端功能。平均池有時(shí)不能提取好的特征,因?yàn)樗鼘⑷坑?jì)入并計(jì)算出平均值,這對(duì)于對(duì)象檢測類型任務(wù)可能不好用但使用
在實(shí)際使用中,全連接層可由卷積操作實(shí)現(xiàn):對(duì)前層是全連接的全連接層可以轉(zhuǎn)化為卷積核為1x1的卷積;而前層是卷積層的全連接層可以轉(zhuǎn)化為卷積核為hxw的全局卷積,h和w分別為前層卷積結(jié)果的高和寬使用 global average pooling 全局平均池化來代替卷積
那么,1*1卷積的主要作用有以下幾點(diǎn):
看這個(gè)問題的回答https://www.zhihu.com/question/56024942/answer/369745892
看這個(gè)問題的回答https://www.zhihu.com/question/41037974/answer/150522307
對(duì)于兩路輸入來說,如果是通道數(shù)相同且后面帶卷積的話,add等價(jià)于concat之后對(duì)應(yīng)通道共享同一個(gè)卷積核。下面具體用式子解釋一下。由于每個(gè)輸出通道的卷積核是獨(dú)立的,我們可以只看單個(gè)通道的輸出。假設(shè)兩路輸入的通道分別為X1, X2, ..., Xc和Y1, Y2, ..., Yc。那么concat的單個(gè)輸出通道為(*表示卷積):
而add的單個(gè)輸出通道為:
因此add相當(dāng)于加了一種prior,當(dāng)兩路輸入可以具有“對(duì)應(yīng)通道的特征圖語義類似”(可能不太嚴(yán)謹(jǐn))的性質(zhì)的時(shí)候,可以用add來替代concat,這樣更節(jié)省參數(shù)和計(jì)算量(concat是add的2倍)。FPN[1]里的金字塔,是希望把分辨率最小但語義最強(qiáng)的特征圖增加分辨率,從性質(zhì)上是可以用add的。如果用concat,因?yàn)榉直媛市〉奶卣魍ǖ罃?shù)更多,計(jì)算量是一筆不少的開銷。https://www.zhihu.com/question/306213462/answer/562776112
SSD是直接分類,而FasterRcnn是先判斷是否為背景再進(jìn)行分類。一個(gè)是直接細(xì)分類,一個(gè)是先粗分類再細(xì)分類。
反向傳播原理看CS231n中的BP過程,以及Jacobian的傳播。
在百面深度學(xué)習(xí)中有相應(yīng)的章節(jié)。
有一篇文章比較好的介紹了,還有在那本電子版CNNbook中也有。
多層神經(jīng)網(wǎng)絡(luò)通常存在像懸崖一樣的結(jié)構(gòu),這是由于幾個(gè)較大的權(quán)重相乘導(dǎo)致的。遇到斜率很大的懸崖結(jié)構(gòu),梯度更新會(huì)很大程序地改變參數(shù)值,通常會(huì)完全跳過這類懸崖的結(jié)構(gòu)?;〞鳳177.
http://ai.51cto.com/art/201710/555389.htm
https://blog.csdn.net/xs11222211/article/details/82931120#commentBox
這個(gè)講的比較好(TP與FP和ROC曲線):
精確率是指分類正確的正樣本個(gè)數(shù)占分類器判定為正樣本的樣本個(gè)數(shù)的比例。召回率是指分類正確的正樣本個(gè)數(shù)占真正的正樣本個(gè)數(shù)的比例。Precision值和Recall值是既矛盾又統(tǒng)一的兩個(gè)指標(biāo),為了提高Precision值,分類器需要盡量在“更有把握”時(shí)才把樣本預(yù)測為正樣本,但此時(shí)往往會(huì)因?yàn)檫^于保守而漏掉很多“沒有把握”的正樣本,導(dǎo)致Recall值很低。如何權(quán)衡這兩個(gè)值,所以出現(xiàn)了PR曲線、ROC曲線以及F1 score等更多的標(biāo)準(zhǔn)來進(jìn)行判斷。https://www.cnblogs.com/xuexuefirst/p/8858274.html
Yolov2相比Yolov1因?yàn)椴捎昧讼闰?yàn)框(Anchor Boxes),模型的召回率大幅提升,同時(shí)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。通過空洞卷積后的卷積特征圖的大小不變,但是這個(gè)卷積的感受野比普通同等大小的卷積大。不過通道數(shù)是可以改變的。
但是要注意,由于空洞卷積本身不會(huì)增大運(yùn)算量,但是后續(xù)的分辨率沒有減小,后面的計(jì)算量就間接變大了。https://zhuanlan.zhihu.com/p/52476083
具體問題具體分析。
如果模型的實(shí)際容量比較大,那么可以說模型可以完全學(xué)習(xí)到整個(gè)數(shù)據(jù)集,會(huì)發(fā)生過擬合。這時(shí)候再添加新的數(shù)據(jù)進(jìn)去,模型的性能會(huì)進(jìn)一步提升,說明模型還沒有被撐死。期望風(fēng)險(xiǎn)是模型關(guān)于聯(lián)合分布的期望損失,經(jīng)驗(yàn)風(fēng)險(xiǎn)是模型關(guān)于訓(xùn)練數(shù)據(jù)集的平均損失。根據(jù)大樹定律,當(dāng)樣本容量N趨于無窮時(shí),經(jīng)驗(yàn)風(fēng)險(xiǎn)趨于期望風(fēng)險(xiǎn)。但是當(dāng)樣本的容量比較小的的時(shí)候,經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化學(xué)習(xí)的效果未必就會(huì)很好,會(huì)產(chǎn)生“過擬合”的現(xiàn)象。結(jié)構(gòu)風(fēng)險(xiǎn)最小化是為了防止過擬合而提出的策略。
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正則,而且這個(gè)正則是針對(duì)模型中所有的參數(shù),不論是w還是b,也包括BN中的W和b。
就是因?yàn)?batch norm 過后, weight 影響沒那么重了,所以 l2 weight decay 的效果就不明顯了。證明了L2正則化與歸一化相結(jié)合時(shí)沒有正則化效應(yīng)。相反,正則化會(huì)影響權(quán)重的范圍,從而影響有效學(xué)習(xí)率。
https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral
空間金字塔池化(SSP)可以使不同尺寸的圖像產(chǎn)生固定的輸出維度。借題也問個(gè)問題,為什么fast rcnn的roi pooling是一個(gè)max pooling呢?roi pooling后面也是做單個(gè)roi的classification,為啥不和classification的pooling不同?我直覺是看feature map中的一個(gè)channel,提取全局特征(如,做classification)用average pooling,提取提取全局信息;提取局部特征(如,roi pooling)應(yīng)該用max pooling,提取局部最明顯的特征,成為7×7的grid后交給后面的fc來做classification。相關(guān)介紹:
https://zhuanlan.zhihu.com/p/71231560
因?yàn)樽髡咛岢隽艘环N方案,同時(shí)改變了多個(gè)條件/參數(shù),他在接下去的消融實(shí)驗(yàn)中,會(huì)一一控制一個(gè)條件/參數(shù)不變,來看看結(jié)果,到底是哪個(gè)條件/參數(shù)對(duì)結(jié)果的影響更大。下面這段話摘自知乎,@人民藝術(shù)家:你朋友說你今天的樣子很帥,你想知道發(fā)型、上衣和褲子分別起了多大的作用,于是你換了幾個(gè)發(fā)型,你朋友說還是挺帥的,你又換了件上衣,你朋友說不帥了,看來這件衣服還挺重要的。
https://oldpan.me/archives/write-hard-nms-c
線性回歸:通過均方誤差來尋找最優(yōu)的參數(shù),然后通過最小二乘法來或者梯度下降法估計(jì):
注意:
來源文章:
對(duì)于凸函數(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
https://zhuanlan.zhihu.com/p/61440116
https://www.zhihu.com/question/65044831/answer/227262160
不看必進(jìn)坑~不論是訓(xùn)練還是部署都會(huì)讓你踩坑的Batch Normalization
Batch size過小會(huì)使Loss曲線振蕩的比較大,大小一般按照2的次冪規(guī)律選擇,至于為什么?沒有答出來,面試官后面解釋是為了硬件計(jì)算效率考慮的,海哥后來也說GPU訓(xùn)練的時(shí)候開的線程是2的次冪個(gè)神經(jīng)網(wǎng)絡(luò)的本質(zhì)是學(xué)習(xí)數(shù)據(jù)的分布,如果訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)的分布不同則會(huì)大大降低網(wǎng)絡(luò)的泛化能力。隨著網(wǎng)絡(luò)訓(xùn)練的進(jìn)行,每個(gè)隱層的變化使得后一層的輸入發(fā)生變化,從而每一批訓(xùn)練的數(shù)據(jù)的分布也會(huì)變化,致使網(wǎng)絡(luò)在每次迭代過程中都需要擬合不同的數(shù)據(jù)分布,增加數(shù)據(jù)訓(xùn)練的復(fù)雜度和過擬合的風(fēng)險(xiǎn)。
對(duì)數(shù)據(jù)的劇烈變化有抵抗能力。
要注意BN在卷積網(wǎng)絡(luò)層中,因?yàn)閰?shù)的共享機(jī)制,每一個(gè)卷積核的參數(shù)在不同位置的神經(jīng)元當(dāng)中是共享的,因此也應(yīng)該被歸一化。(具體看一下實(shí)現(xiàn)過程)https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/batch_norm_layer.html但是在訓(xùn)練過程中如果batch-size不大的話,可以不使用BN(MaskRcnn這樣說的)。至此,關(guān)于Batch Normalization的理論與實(shí)戰(zhàn)部分就介紹道這里。總的來說,BN通過將每一層網(wǎng)絡(luò)的輸入進(jìn)行normalization,保證輸入分布的均值與方差固定在一定范圍內(nèi),減少了網(wǎng)絡(luò)中的Internal Covariate Shift問題,并在一定程度上緩解了梯度消失,加速了模型收斂;并且BN使得網(wǎng)絡(luò)對(duì)參數(shù)、激活函數(shù)更加具有魯棒性,降低了神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練和調(diào)參的復(fù)雜度;最后BN訓(xùn)練過程中由于使用mini-batch的mean/variance作為總體樣本統(tǒng)計(jì)量估計(jì),引入了隨機(jī)噪聲,在一定程度上對(duì)模型起到了正則化的效果。
BN與貝葉斯的關(guān)系:
在實(shí)踐中,我發(fā)現(xiàn),跨卡同步的BN對(duì)于performance相當(dāng)有用。尤其是對(duì)于detection,segmentation任務(wù),本來Batch size較小。如果Batch Norm能跨卡同步的話,就相當(dāng)于增大了Batch Norm的batch size 這樣能估計(jì)更加準(zhǔn)確的mean和variance,所以這個(gè)操作能提升performance。
跨卡同步BN的關(guān)鍵是在前向運(yùn)算的時(shí)候拿到全局的均值和方差,在后向運(yùn)算時(shí)候得到相應(yīng)的全局梯度。最簡單的實(shí)現(xiàn)方法是先同步求均值,再發(fā)回各卡然后同步求方差,但是這樣就同步了兩次。實(shí)際上只需要同步一次就可以,我們使用了一個(gè)非常簡單的技巧,改變方差的公式(公式是圖片,具體大家自己網(wǎng)上搜一下SyncBN)。這樣在前向運(yùn)算的時(shí)候,我們只需要在各卡上算出與,再跨卡求出全局的和即可得到正確的均值和方差, 同理我們在后向運(yùn)算的時(shí)候只需同步一次,求出相應(yīng)的梯度與。我們在最近的論文Context Encoding for Semantic Segmentation 里面也分享了這種同步一次的方法。有了跨卡BN我們就不用擔(dān)心模型過大用多卡影響收斂效果了,因?yàn)椴还苡枚嗌購埧ㄖ灰值呐看笮∫粯?,都?huì)得到相同的效果。
出現(xiàn)因素:
原因,誤差傳播公式可以寫成參數(shù)W和導(dǎo)數(shù)F連乘的形式,當(dāng)誤差由第L層傳播到輸入以外的第一個(gè)隱含層的時(shí)候,會(huì)涉及到很多很多的參數(shù)和導(dǎo)數(shù)的連乘,這時(shí)誤差很容易產(chǎn)生消失或者膨脹,導(dǎo)致不容易學(xué)習(xí),擬合能力和泛化能力較差。殘差層中的F層只需要擬合輸入x與目標(biāo)輸出H的殘差H-x即可,如果某一層的輸出已經(jīng)較好地?cái)M合了期望結(jié)果,那么多一層也不回使得模型變得更差,因?yàn)樵搶拥妮敵鲋苯颖欢探拥絻蓪又螅喈?dāng)于直接學(xué)習(xí)了一個(gè)恒等映射,而跳過的兩層只需要擬合上層輸出和目標(biāo)之間的殘差即可。
resnet其實(shí)無法真正的實(shí)現(xiàn)梯度消失,這里面有很強(qiáng)的先驗(yàn)假設(shè),并且resnet真正起作用的層只在中間,深層作用比較小(到了深層就是恒等映射了),feature存在利用不足的現(xiàn)象,add的方式阻礙了梯度和信息的流通。
L1正則可以使少數(shù)權(quán)值較大,多數(shù)權(quán)值為0,得到稀疏的權(quán)值;L2正則會(huì)使權(quán)值都趨近于0但非零,得到平滑的權(quán)值;https://zhuanlan.zhihu.com/p/35356992
目前的權(quán)重初始化分為三類:
初始化,說白了就是構(gòu)建一個(gè)平滑的局部幾何空間從而使得優(yōu)化更簡單xavier分布解析:
假設(shè)使用的是sigmoid函數(shù)。當(dāng)權(quán)重值(值指的是絕對(duì)值)過小,輸入值每經(jīng)過網(wǎng)絡(luò)層,方差都會(huì)減少,每一層的加權(quán)和很小,在sigmoid函數(shù)0附件的區(qū)域相當(dāng)于線性函數(shù),失去了DNN的非線性性。當(dāng)權(quán)重的值過大,輸入值經(jīng)過每一層后方差會(huì)迅速上升,每層的輸出值將會(huì)很大,此時(shí)每層的梯度將會(huì)趨近于0. xavier初始化可以使得輸入值x 方差經(jīng)過網(wǎng)絡(luò)層后的輸出值y方差不變。
在pytorch中默認(rèn)的權(quán)重初始化方式是何凱明的那個(gè),舉個(gè)例子:
差不多這幾個(gè)懂了就OK。
可以看老潘的這篇文章:
那么,如何用softmax和sigmoid來做多類分類和多標(biāo)簽分類呢?
1、如何用softmax做多分類和多標(biāo)簽分類 現(xiàn)假設(shè),神經(jīng)網(wǎng)絡(luò)模型最后的輸出是這樣一個(gè)向量logits=[1,2,3,4], 就是神經(jīng)網(wǎng)絡(luò)最終的全連接的輸出。這里假設(shè)總共有4個(gè)分類。用softmax做多分類的方法:
2、如何用sigmoid做多標(biāo)簽分類 sigmoid一般不用來做多類分類,而是用來做二分類的,它是將一個(gè)標(biāo)量數(shù)字轉(zhuǎn)換到[0,1]之間,如果大于一個(gè)概率閾值(一般是0.5),則認(rèn)為屬于某個(gè)類別,否則不屬于某個(gè)類別。那么如何用sigmoid來做多標(biāo)簽分類呢?其實(shí)就是針對(duì)logits中每個(gè)分類計(jì)算的結(jié)果分別作用一個(gè)sigmoid分類器,分別判定樣本是否屬于某個(gè)類別。同樣假設(shè),神經(jīng)網(wǎng)絡(luò)模型最后的輸出是這樣一個(gè)向量logits=[1,2,3,4], 就是神經(jīng)網(wǎng)絡(luò)最終的全連接的輸出。這里假設(shè)總共有4個(gè)分類。
為了消除數(shù)據(jù)特征之間的量綱影響在實(shí)際應(yīng)用中,通過梯度下降法求解的模型通常是需要數(shù)據(jù)歸一化的,包括線性回歸、邏輯回歸、支持向量機(jī)、神經(jīng)網(wǎng)絡(luò)等,但是決策模型不是很適用。
首先,假設(shè)你知道訓(xùn)練集和測試集的關(guān)系。簡單來講是我們要在訓(xùn)練集上學(xué)習(xí)一個(gè)模型,然后拿到測試集去用,效果好不好要根據(jù)測試集的錯(cuò)誤率來衡量。但很多時(shí)候,我們只能假設(shè)測試集和訓(xùn)練集的是符合同一個(gè)數(shù)據(jù)分布的,但卻拿不到真正的測試數(shù)據(jù)。這時(shí)候怎么在只看到訓(xùn)練錯(cuò)誤率的情況下,去衡量測試錯(cuò)誤率呢?
由于訓(xùn)練樣本很少(至少不足夠多),所以通過訓(xùn)練集得到的模型,總不是真正正確的。(就算在訓(xùn)練集上正確率100%,也不能說明它刻畫了真實(shí)的數(shù)據(jù)分布,要知道刻畫真實(shí)的數(shù)據(jù)分布才是我們的目的,而不是只刻畫訓(xùn)練集的有限的數(shù)據(jù)點(diǎn))。而且,實(shí)際中,訓(xùn)練樣本往往還有一定的噪音誤差,所以如果太追求在訓(xùn)練集上的完美而采用一個(gè)很復(fù)雜的模型,會(huì)使得模型把訓(xùn)練集里面的誤差都當(dāng)成了真實(shí)的數(shù)據(jù)分布特征,從而得到錯(cuò)誤的數(shù)據(jù)分布估計(jì)。這樣的話,到了真正的測試集上就錯(cuò)的一塌糊涂了(這種現(xiàn)象叫過擬合)。但是也不能用太簡單的模型,否則在數(shù)據(jù)分布比較復(fù)雜的時(shí)候,模型就不足以刻畫數(shù)據(jù)分布了(體現(xiàn)為連在訓(xùn)練集上的錯(cuò)誤率都很高,這種現(xiàn)象較欠擬合)。過擬合表明采用的模型比真實(shí)的數(shù)據(jù)分布更復(fù)雜,而欠擬合表示采用的模型比真實(shí)的數(shù)據(jù)分布要簡單。
在統(tǒng)計(jì)學(xué)習(xí)框架下,大家刻畫模型復(fù)雜度的時(shí)候,有這么個(gè)觀點(diǎn),認(rèn)為Error = Bias + Variance。這里的Error大概可以理解為模型的預(yù)測錯(cuò)誤率,是有兩部分組成的,一部分是由于模型太簡單而帶來的估計(jì)不準(zhǔn)確的部分(Bias),另一部分是由于模型太復(fù)雜而帶來的更大的變化空間和不確定性(Variance)。
所以,這樣就容易分析樸素貝葉斯了。它簡單的假設(shè)了各個(gè)數(shù)據(jù)之間是無關(guān)的,是一個(gè)被嚴(yán)重簡化了的模型。所以,對(duì)于這樣一個(gè)簡單模型,大部分場合都會(huì)Bias部分大于Variance部分,也就是說高偏差而低方差。
在實(shí)際中,為了讓Error盡量小,我們在選擇模型的時(shí)候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。
https://zhuanlan.zhihu.com/p/42122107
https://zhuanlan.zhihu.com/p/59640437
傳統(tǒng)的目標(biāo)檢測一般分為以下幾個(gè)步驟:
經(jīng)典的結(jié)構(gòu):
傳統(tǒng)方法的缺點(diǎn):
可以看學(xué)習(xí)OpenCV第三版中的相關(guān)內(nèi)容,搜索erode、dilation
在網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行特征融合的時(shí)候,雙線性插值的方式比轉(zhuǎn)置卷積要好一點(diǎn)。因?yàn)檗D(zhuǎn)置卷積有一個(gè)比較大的問題就是如果參數(shù)配置不當(dāng),很容易出現(xiàn)輸出feature map中帶有明顯棋盤狀的現(xiàn)象。
雙線性插值也分為兩類:
一般來說,使用align_corners=True可以保證邊緣對(duì)齊,而使用align_corners=False則會(huì)導(dǎo)致邊緣突出的情況。這個(gè)講的非常好:
代碼實(shí)現(xiàn)的講解:
為了避免梯度爆炸而做出的改進(jìn),注意要和提前終止區(qū)別開來。(提前終止是一種正則化方法,因?yàn)楫?dāng)訓(xùn)練有足夠能力表示甚至?xí)^擬合的大模型時(shí),訓(xùn)練誤差會(huì)隨著時(shí)間的推移逐漸降低但驗(yàn)證集的誤差會(huì)再次上升。這意味著只要我們返回使驗(yàn)證集誤差最低的參數(shù)設(shè)置即可)第一種做法很容易理解,就是先設(shè)定一個(gè) gradient 的范圍如 (-1, 1), 小于 -1 的 gradient 設(shè)為 -1, 大于這個(gè) 1 的 gradient 設(shè)為 1.
實(shí)現(xiàn)卷積一般用的是im2col的形式,但是面試中我們簡單實(shí)現(xiàn)一個(gè)滑窗法就行了。比如:用3x3的卷積核(濾波盒)實(shí)現(xiàn)卷積操作。NCNN中在PC端卷積的源碼也是這樣的。
參考:
看看Pytorch的源碼與caffe的源碼,都是將卷積計(jì)算轉(zhuǎn)化為矩陣運(yùn)算,im2col,然后gemm。https://blog.csdn.net/mrhiuser/article/details/52672824
https://cloud.tencent.com/developer/article/1363619
1x1卷積可以改變上一層網(wǎng)絡(luò)的通道數(shù)目。卷積核大于1x1,意味著提特征需要鄰域信息。
所以對(duì)懶人來說,最優(yōu)核的尺寸的期望是正方形。至于
注意,resnet中是先降維再升維,而mobilenetv2中是先升維后降維(所以稱之為inversed)。
很簡單但是也很容易錯(cuò)的問題:
依據(jù)采用動(dòng)態(tài)計(jì)算或是靜態(tài)計(jì)算的不同,可以將這些眾多的深度學(xué)習(xí)框架劃分成兩大陣營,當(dāng)然也有些框架同時(shí)具有動(dòng)態(tài)計(jì)算和靜態(tài)計(jì)算兩種機(jī)制(比如 MxNet 和最新的 TensorFlow)。動(dòng)態(tài)計(jì)算意味著程序?qū)凑瘴覀兙帉懨畹捻樞蜻M(jìn)行執(zhí)行。這種機(jī)制將使得調(diào)試更加容易,并且也使得我們將大腦中的想法轉(zhuǎn)化為實(shí)際代碼變得更加容易。而靜態(tài)計(jì)算則意味著程序在編譯執(zhí)行時(shí)將先生成神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),然后再執(zhí)行相應(yīng)操作。從理論上講,靜態(tài)計(jì)算這樣的機(jī)制允許編譯器進(jìn)行更大程度的優(yōu)化,但是這也意味著你所期望的程序與編譯器實(shí)際執(zhí)行之間存在著更多的代溝。這也意味著,代碼中的錯(cuò)誤將更加難以發(fā)現(xiàn)(比如,如果計(jì)算圖的結(jié)構(gòu)出現(xiàn)問題,你可能只有在代碼執(zhí)行到相應(yīng)操作的時(shí)候才能發(fā)現(xiàn)它)。盡管理論上而言,靜態(tài)計(jì)算圖比動(dòng)態(tài)計(jì)算圖具有更好的性能,但是在實(shí)踐中我們經(jīng)常發(fā)現(xiàn)并不是這樣的。
這個(gè)可以看CS231n中的第九課以及
正式總結(jié)下:
shufflenet:https://blog.csdn.net/u011974639/article/details/79200559
正太分布:https://blog.csdn.net/yaningli/article/details/78051361
MaxPool導(dǎo)致的訓(xùn)練震蕩(通過在MaxPool之后加上L2Norm)//mp.weixin.qq.com/s/QR-KzLxOBazSbEFYoP334Q
https://zhuanlan.zhihu.com/p/64510297
感受野計(jì)算有兩個(gè)公式,一個(gè)普通公式一個(gè)通項(xiàng)公式:
需要注意,卷積和池化都可以增加感受野。
http://zike.io/posts/calculate-receptive-field-for-vgg-16/
KNN K近鄰
二維高斯核函數(shù)
`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
`
訓(xùn)練采樣方法
Kmean和GMM原理、區(qū)別、應(yīng)用場景
如何在多臺(tái)計(jì)算機(jī)上做kmeans
KNN算法以及流程
無監(jiān)督學(xué)習(xí)和有監(jiān)督學(xué)習(xí)的區(qū)別
邏輯回歸與SVM區(qū)別
bagging boosting 和 提升樹
SVM
凸集、凸函數(shù)、凸優(yōu)化
為什么深度學(xué)習(xí)中的圖像分割要先編碼后解碼
(全局)平均池化average pooling和(全局)最大池化max pooling的區(qū)別
平均池化
的一個(gè)動(dòng)機(jī)是每個(gè)空間位置具有用于期望特征
的檢測器,并且通過平均每個(gè)空間位置,其行為類似于平均輸入圖像的不同平移的預(yù)測(有點(diǎn)像數(shù)據(jù)增加)。Resnet不是采用傳統(tǒng)的完全連通層進(jìn)行CNN分類,而是直接從最后一個(gè)mlp轉(zhuǎn)換層輸出特征圖的空間平均值,作為通過全局平均合并層的類別置信度,然后將得到的矢量輸入到 softmax層。相比之下,Global average更有意義且可解釋,因?yàn)樗鼜?qiáng)制實(shí)現(xiàn)了feature和類別之間的對(duì)應(yīng)關(guān)系,這可以通過使用網(wǎng)絡(luò)的更強(qiáng)大的本地建模來實(shí)現(xiàn)。此外,完全連接的層易于過擬合并且嚴(yán)重依賴于 dropout 正則化,而全局平均池化本身就是起到了正則化作用,其本身防止整體結(jié)構(gòu)的過擬合。
全連接的作用,與1x1卷積層的關(guān)系
1*1的卷積,那么結(jié)果的大小為500*500*20
。
concat與add(sum)的區(qū)別
SSD怎么改動(dòng)變成FasterRCNN
反向傳播的原理
GD、SGD、mini batch GD的區(qū)別
偏差、方差
為什么會(huì)梯度爆炸,如何防止
分布式訓(xùn)練,多卡訓(xùn)練
精確率和召回率以及PR曲線
空洞卷積
數(shù)據(jù)不好怎么辦,數(shù)據(jù)不均衡怎么處理、只有少量帶標(biāo)簽怎么處理
訓(xùn)練過程中需要過擬合情況怎么辦
正則化
BN層和L2正則化一起有什么后果
ROIPooling和ROIAlign的區(qū)別
自己實(shí)現(xiàn)圖像增強(qiáng)算法
圖像分類的tricks
消融實(shí)驗(yàn)(Ablation experiment)
手?jǐn)]NMS與soft-NMS
邏輯回歸和線性回歸
什么是attention,有哪幾種
深度學(xué)習(xí)的線性和非線性
梯度消失和梯度爆炸的問題
Batch-norm層的作用
BN跨卡訓(xùn)練怎么保證相同的mean和var
如何實(shí)現(xiàn)SyncBN
ResNet為什么好用
Resnet的缺點(diǎn)
L1范數(shù)和L2范數(shù) 應(yīng)用場景
網(wǎng)絡(luò)初始化有哪些方式,他們的公式初始化過程
resnet中權(quán)重的初始化
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)
求解模型參數(shù)量
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('ModelSize:%fMBparameters,%fMBgradients
'%(n_p*4/1e6,n_g*4/1e6))
卷積計(jì)算量
多標(biāo)簽和多分類
tf.argmax(tf.softmax(logits))
首先用softmax將logits轉(zhuǎn)換成一個(gè)概率分布,然后取概率值最大的作為樣本的分類,這樣看似乎,tf.argmax(logits)同樣可以取得最大的值,也能得到正確的樣本分類,這樣的話softmax似乎作用不大.那么softmax的主要作用其實(shí)是在計(jì)算交叉熵上,首先樣本集中y是一個(gè)one-hot向量,如果直接將模型輸出logits和y來計(jì)算交叉熵,因?yàn)閘ogits=[1,2,3,4],計(jì)算出來的交叉熵肯定很大,這種計(jì)算方式不對(duì),而應(yīng)該將logits轉(zhuǎn)換成一個(gè)概率分布后再來計(jì)算,就是用tf.softmax(logits)和y來計(jì)算交叉熵,當(dāng)然我們也可以直接用tensorflow提供的方法sofmax_cross_entropy_with_logits來計(jì)算 這個(gè)方法傳入的參數(shù)可以直接是logits,因?yàn)檫@個(gè)根據(jù)方法的名字可以看到,方法內(nèi)部會(huì)將參數(shù)用softmax進(jìn)行處理,現(xiàn)在我們?nèi)〉母怕史植贾凶畲蟮淖鳛樽罱K的分類結(jié)果,這是多分類。我們也可以取概率的top幾個(gè),作為最終的多個(gè)標(biāo)簽,或者設(shè)置一個(gè)閾值,并取大于概率閾值的。這就用softmax實(shí)現(xiàn)了多標(biāo)簽分類。tf.sigmoid(logits)
sigmoid應(yīng)該會(huì)將logits中每個(gè)數(shù)字都變成[0,1]之間的概率值,假設(shè)結(jié)果為[0.01, 0.05, 0.4, 0.6],然后設(shè)置一個(gè)概率閾值,比如0.3,如果概率值大于0.3,則判定類別符合,那這里,樣本會(huì)被判定為類別3和類別4都符合。
數(shù)據(jù)的輸入為什么要?dú)w一化
為什么說樸素貝葉斯是高偏差低方差?
Canny邊緣檢測,邊界檢測算法有哪些
傳統(tǒng)的目標(biāo)檢測
腐蝕膨脹、開運(yùn)算閉運(yùn)算
一些濾波器
Resize雙線性插值
gradient clipping 梯度裁剪
實(shí)現(xiàn)一個(gè)簡單的卷積
`/*
輸入: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ù)一一對(duì)應(yīng)即可
*/
for(int ch=0;ch<output.channels;ch++)
{
for(int oh=0;oh<output.height;oh++)
{
for(int ow=0;ow<output.width;ow++)
{
float sum=0;
for(int kc=0;kc<kernel.channels;kc++)
{
for(int kh=0;kh<kernel.height;kh++)
{
for(int kw=0;kw<kernel.width;kw++)
{
sum += input[kc][oh+kh][ow+kw]*kernel[ch][kc][kh][kw];
}
}
}
//if(bias) sum +=bias[]
output[ch][oh][ow]=sum;
}
}
}
`
卷積的過程
轉(zhuǎn)置卷積的計(jì)算過程
1*1
的卷積核有什么用,3*3
的卷積核和一個(gè)1*3
加一個(gè)3*1
的有什么區(qū)別1*n
和n*1
,它們一般是搭配使用的,從而實(shí)現(xiàn)n*n卷積核的感受野,可以在減少參數(shù)的同時(shí)增加層數(shù),在CNN的較高層中使用可以帶來一定的優(yōu)勢。卷積核并非都是正方形的,還可以是矩形,比如3*5,在文本檢測和車牌檢測當(dāng)中就有應(yīng)用,這種設(shè)計(jì)主要針對(duì)文本行或者車牌的形狀,能更好的學(xué)習(xí)特征。其實(shí)我覺得方形矩形影響不大,網(wǎng)絡(luò)的學(xué)習(xí)能力是非常強(qiáng)的。當(dāng)然我們也可以學(xué)習(xí)卷積的形狀,類似于deformable convolution
,老潘后續(xù)會(huì)講下。
ResNet中bottlenet與mobilenetv2的inverted結(jié)構(gòu)對(duì)比
卷積特征圖大小的計(jì)算
動(dòng)態(tài)圖和靜態(tài)圖的區(qū)別
歷年來所有的網(wǎng)絡(luò)
depthwise Separable Conv
讓人眼前一亮。https://www.jianshu.com/p/4708a09c4352
一些統(tǒng)計(jì)知識(shí)
關(guān)于如何訓(xùn)練(訓(xùn)練過程中的一些問題)
全連接層的好伴侶:空間金字塔池化(SPP)
感受野計(jì)算
-
算法
+關(guān)注
關(guān)注
23文章
4623瀏覽量
93110 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8428瀏覽量
132837 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5510瀏覽量
121338
原文標(biāo)題:機(jī)器學(xué)習(xí)、深度學(xué)習(xí)面試知識(shí)點(diǎn)匯總
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論