境搭建到模型部署)
簡介DeepLearningToolbox是一款基于MATLAB的深度學(xué)習(xí)工具包面向希望從代碼層面理解經(jīng)典深度學(xué)習(xí)模型的研究者與初學(xué)者。工具包覆蓋前饋神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、深度信念網(wǎng)絡(luò)、棧式自編碼器及卷積自編碼器等常用模型并提供了對應(yīng)的訓(xùn)練、測試與可視化函數(shù)資源共74個文件以66個m格式的源碼文件為主同時包含說明文檔、單元測試、配置腳本以及MNIST手寫數(shù)字示例數(shù)據(jù)壓縮包大小約14.07MB目錄按神經(jīng)網(wǎng)絡(luò)、卷積網(wǎng)絡(luò)、深度信念網(wǎng)絡(luò)、自編碼器、工具函數(shù)、數(shù)據(jù)、測試等模塊劃分結(jié)構(gòu)清晰便于按需查閱。包內(nèi)附有多個可直接運(yùn)行的示例例如使用深度信念網(wǎng)絡(luò)做預(yù)訓(xùn)練與微調(diào)、利用棧式自編碼器初始化前饋網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)手寫數(shù)字識別以及普通神經(jīng)網(wǎng)絡(luò)中的dropout、L2正則化、softmax輸出等實(shí)驗(yàn)?zāi)軌驇椭x者直觀理解反向傳播、特征提取、參數(shù)更新等關(guān)鍵環(huán)節(jié)。此外代碼注釋完整、環(huán)境配置簡單通過添加路徑即可快速使用雖然作者已宣告不再維護(hù)但對于深度學(xué)習(xí)初學(xué)者而言仍是學(xué)習(xí)經(jīng)典模型實(shí)現(xiàn)的一份高性價比參考資料。已有8930人學(xué)習(xí)下載適合希望在MATLAB中動手實(shí)踐深度學(xué)習(xí)的用戶。 “DeepLearningToolbox”這個名字想必不少剛接觸深度學(xué)習(xí)的朋友都搜到過。但真要上手時你會發(fā)現(xiàn)它背后其實(shí)藏著兩條完全不同的路線一條是早年GitHub上那個經(jīng)典的Matlab深度學(xué)習(xí)工具箱另一條則是后來官方全面整合的深度學(xué)習(xí)工具鏈。再加上各個行業(yè)軟件里內(nèi)嵌的深度學(xué)習(xí)模塊比如工業(yè)視覺里的Halcon DL Tool、遙感領(lǐng)域的ENVI、GIS里的ArcGIS Pro很多人一開始根本分不清自己該裝哪個、該學(xué)哪個。這篇文章就從“DeepLearningToolbox”這個詞切入把工具選型、環(huán)境配置、模型訓(xùn)練、樣本處理和模型部署這幾個環(huán)節(jié)一次講透。我踩過的坑、試出來的穩(wěn)妥方案、以及那些文檔里不會明說的細(xì)節(jié)都會一并放在里面。無論你是剛?cè)腴T的初學(xué)者還是已經(jīng)在做工業(yè)缺陷檢測、遙感影像分類、語音降噪的工程師這篇內(nèi)容都能幫你省下不少摸索的時間。1. DeepLearningToolbox的兩副面孔社區(qū)工具箱與官方工具鏈1.1 早年那個“上古”工具箱到底能干什么如果你在搜索引擎里輸入DeepLearningToolbox大概率會翻到GitHub上那個非常經(jīng)典的項(xiàng)目。它最早是Rasmus Berg Palm等人整理的一套Matlab實(shí)現(xiàn)核心是一組深度網(wǎng)絡(luò)模型包括深度置信網(wǎng)絡(luò)DBN、棧式自編碼器SAE、卷積神經(jīng)網(wǎng)絡(luò)CNN和卷積自編碼器CAE。在那個深度學(xué)習(xí)還沒有像今天這樣普及的年代這套工具箱承擔(dān)了很大的教學(xué)和科研作用。它最大的優(yōu)勢就是“輕”和“透明”。整個工具箱沒有復(fù)雜的依賴體系下載下來把子目錄加入Matlab路徑就能直接用。每個算法模塊都拆得很細(xì)網(wǎng)絡(luò)層的前向傳播、反向傳播、梯度計(jì)算都是明明白白的這對手寫數(shù)字識別MNIST這類入門項(xiàng)目來說是極好的學(xué)習(xí)材料。我第一次跑通卷積神經(jīng)網(wǎng)絡(luò)就是在這套工具箱上完成的那種“原來反向傳播是這樣運(yùn)作”的豁然開朗是直接在框架里調(diào)用接口很難獲得的體驗(yàn)。不過放到今天來看它的局限也很明顯。這個工具箱的設(shè)計(jì)更接近教學(xué)演示而不是生產(chǎn)級工具。如果你想用它做大規(guī)模圖像分類、目標(biāo)檢測或者是序列建模效率上會吃不少虧社區(qū)的維護(hù)和更新也早已停滯。1.2 官方深度學(xué)習(xí)工具箱Matlab的現(xiàn)代答案而今你在MathWorks官網(wǎng)看到的Deep Learning Toolbox已經(jīng)是圍繞TensorFlow和PyTorch生態(tài)逐步整合的官方產(chǎn)品內(nèi)置了圖像分類、目標(biāo)檢測、語義分割、時間序列預(yù)測等豐富的算法層還支持從TensorFlow/Keras、PyTorch、ONNX格式導(dǎo)入預(yù)訓(xùn)練模型再在Matlab里做遷移學(xué)習(xí)、調(diào)參和部署。這個走向其實(shí)很有代表性官方工具在做的不是重復(fù)“造輪子”而是把“輪子”接到主流的深度學(xué)習(xí)生態(tài)上。對很多做信號處理、傳統(tǒng)圖像處理出身的人而言這個工具箱的價值在于它把深度學(xué)習(xí)和既有的Matlab工作流打通了很多原本用Kalman濾波器、小波分析處理的信號現(xiàn)在可以套一個LSTM或一維CNN試試效果而且不需要重新學(xué)一套編程框架。1.3 各行業(yè)軟件里的“隱藏”深度學(xué)習(xí)工具除了通用框架還有一批藏在垂直軟件里的深度學(xué)習(xí)工具熱度一直很高比如Halcon的DL Tool、ENVI的深度學(xué)習(xí)模塊、ArcGIS Pro里的深度學(xué)習(xí)工具。在工業(yè)視覺領(lǐng)域Halcon的深度學(xué)習(xí)標(biāo)注工具和推理模塊用得非常廣。它跟通用框架最大的不同是一切都被包裝成了圖形化的流程標(biāo)注、訓(xùn)練、驗(yàn)證、導(dǎo)出一套走完。它內(nèi)部基于CUDA加速推理如果你用GPU推理遇到速度慢的問題大概率是Halcon的硬件加速配置沒對。遙感軟件ENVI和ArcGIS Pro里的深度學(xué)習(xí)模塊則往往面向衛(wèi)星影像、無人機(jī)的多光譜影像涉及柵格轉(zhuǎn)矢量、樣本生成、模型訓(xùn)練等一套專門流程。但凡在ENVI里訓(xùn)練失敗很多情況下都出在樣本框和標(biāo)簽格式問題上而不是模型本身。別小看了這些行業(yè)軟件里的工具它們往往是工作中真正需要使用的東西。理解它們的定位能讓你在選型時少走很多彎路。2. 工具包選型的核心邏輯搞清楚你的場景和資源上限2.1 主流框架的橫向?qū)Ρ痊F(xiàn)在做深度學(xué)習(xí)多數(shù)人會在PyTorch和TensorFlow之間做選擇。從我自己的經(jīng)驗(yàn)看PyTorch的調(diào)試體驗(yàn)更好報(bào)錯信息相對清晰寫自定義網(wǎng)絡(luò)層、改訓(xùn)練邏輯都很順手TensorFlow在生產(chǎn)部署上有它的優(yōu)勢特別是配合TensorFlow Serving或者遷移到移動端的TFLite鏈路非常成熟。Keras現(xiàn)在基本已經(jīng)作為TensorFlow的高層接口存在了適合快速驗(yàn)證想法但它的“過度封裝”會讓很多人忽略底層原理一旦模型表現(xiàn)異常排查起來反而費(fèi)力。Matlab的官方工具箱更貼近傳統(tǒng)算法工程師的使用習(xí)慣如果你的工作流核心是信號處理、控制或圖像處理用Matlab做深度學(xué)習(xí)反而更順暢。2.2 選型時容易被忽略的隱形成本很多人選框架只看誰的接口好用誰的模型庫全卻忽略了三個隱形成本。第一個是運(yùn)行環(huán)境成本。PyTorch、TensorFlow這類輕量級框架在CPU上也能跑只是慢Halcon這類商業(yè)軟件則不同它自己的深度學(xué)習(xí)模塊要求對GPU做專門的適配如果顯卡不兼容、驅(qū)動版本不對訓(xùn)練可能根本跑不起來。第二個是部署鏈路成本。做工業(yè)項(xiàng)目時訓(xùn)練環(huán)境和部署環(huán)境往往是隔離的如果訓(xùn)練時圖省事在Windows上跑而現(xiàn)場機(jī)器是Ubuntu中間可能會遇到不少坑。第三個是生態(tài)學(xué)習(xí)成本。每個框架的“玩法”不同換一個框架前面的經(jīng)驗(yàn)要打不少折扣投入的學(xué)習(xí)周期不容小覷。我個人的建議是如果你的主要場景是學(xué)術(shù)研究和算法驗(yàn)證優(yōu)先選PyTorch如果是為了快速落地到已有的行業(yè)軟件工作流里優(yōu)先選跟你配套的那個商業(yè)工具如果只是入門了解深度學(xué)習(xí)原理用Matlab的經(jīng)典工具箱或Keras跑通一遍手寫數(shù)字識別理解反而更透徹。2.3 從熱搜詞里看到的真實(shí)需求分布看看大家的搜索習(xí)慣就會發(fā)現(xiàn)需求分布其實(shí)非常集中重訓(xùn)練精度、重環(huán)境配置、重模型選型。具體來說“深度學(xué)習(xí) 訓(xùn)練輪數(shù) 精度”、“深度學(xué)習(xí)CNN”、“halcon深度學(xué)習(xí)檢測加速”這類是高頻搜索詞這背后是大量工程師在產(chǎn)線上做檢測想提高準(zhǔn)確率和速度“vscode配置深度學(xué)習(xí)環(huán)境”、“深度學(xué)習(xí)pytorch環(huán)境安裝教程”則說明很多人卡在了環(huán)境搭建這一步。這些問題表面看是技術(shù)問題本質(zhì)上都是“目標(biāo)不清”和“路徑不明”導(dǎo)致的。下面幾個章節(jié)就按最常見的學(xué)習(xí)路徑把關(guān)鍵環(huán)節(jié)逐步拆開講。3. 環(huán)境搭建的經(jīng)典坑Windows、Mac與無Anaconda的輕量方案3.1 為Windows系統(tǒng)搭建深度學(xué)習(xí)環(huán)境的關(guān)鍵卡點(diǎn)在Windows上配深度學(xué)習(xí)環(huán)境最常遇到的就是CUDA、cuDNN和框架版本要互相匹配的問題。很多人裝不好環(huán)境就是因?yàn)檠b完CUDA發(fā)現(xiàn)版本不匹配然后卸載重裝來回折騰。一個相對穩(wěn)妥的做法是先決定框架版本再根據(jù)框架要求去反推CUDA版本而不是反過來先裝最新的CUDA。比如PyTorch某個版本要求CUDA 11.8或12.1那就按這個版本去裝別一上來就裝最新版的CUDA 12.x很可能會遇到兼容性問題。另外Windows上還有一個容易被忽略的點(diǎn)是GPU驅(qū)動版本。驅(qū)動和CUDA是兩回事驅(qū)動太老新版的CUDA跑不起來驅(qū)動太新舊版本的CUDA偶爾也會出問題。最省事的辦法是更新到當(dāng)前可用的最新驅(qū)動然后讓CUDA Toolkit自帶的檢查工具去驗(yàn)證是否正常。3.2 不使用Anaconda直接裝PyTorch的步驟很多人習(xí)慣用Anaconda建虛擬環(huán)境但說實(shí)話Anaconda的“全家桶”體積和啟動速度都讓人頭疼。如果只是想跑深度學(xué)習(xí)完全可以不用Anaconda。我實(shí)測下來用Python自帶的venv配合pip完全可以滿足絕大多數(shù)項(xiàng)目的需求而且環(huán)境更干凈、啟動更快。具體步驟如下# 1. 創(chuàng)建并激活虛擬環(huán)境 python -m venv dl_env # Windows下激活 dl_env\Scripts\activate # macOS/Linux下激活 source dl_env/bin/activate # 2. 安裝PyTorch以CPU版為例 pip install torch torchvision torchaudio # 3. 安裝其他常用依賴 pip install numpy pandas matplotlib scikit-learn jupyter如果本機(jī)有NVIDIA顯卡需要GPU加速那就去PyTorch官網(wǎng)按你的操作系統(tǒng)和CUDA版本復(fù)制對應(yīng)的安裝命令比如pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118注意這里不要用什么加速鏡像去裝GPU版PyTorch因?yàn)槔锩娴陌鸵蕾嚳赡懿煌暾?。直接連PyTorch官方下載源一次性裝好避免后續(xù)各種奇怪的問題。3.3 VSCode遠(yuǎn)程開發(fā)的配置心得很多人在VSCode里配置深度學(xué)習(xí)環(huán)境第一步就卡在了解釋器選擇上。新版本VSCode默認(rèn)支持自動識別虛擬環(huán)境但前提是你得在VSCode里打開“Python: Select Interpreter”面板找到你剛創(chuàng)建的dl_env目錄下的python.exe。如果看不到可以手動添加路徑。另外VSCode還有一項(xiàng)非常實(shí)用的功能就是“Remote-SSH”。在遠(yuǎn)程服務(wù)器上配好環(huán)境后本地用VSCode連過去代碼在服務(wù)器上跑、調(diào)試在本地做體驗(yàn)非常接近本地開發(fā)。我日常工作基本都是這樣的方式性能不比本地差環(huán)境也完全可控。3.4 Mac環(huán)境的差異與特殊處理Mac芯片分Intel和Apple Silicon兩種后者在安裝PyTorch時有坑。在Apple SiliconM1/M2/M3上現(xiàn)在PyTorch官方已經(jīng)提供ARM64的安裝包直接pip裝就行不需要裝Rosetta轉(zhuǎn)譯版。千萬別用Rosetta方式裝x86版Python再裝PyTorch——性能和穩(wěn)定性都會打折扣。順帶一提Mac上配深度學(xué)習(xí)環(huán)境很多人會用Homebrew補(bǔ)齊依賴鏈。Homebrew裝Python和庫更方便但要注意Python版本別太新某些庫可能還沒有對應(yīng)的預(yù)編譯包這時最好按官方文檔建議的Python版本走。4. 模型訓(xùn)練的關(guān)鍵參數(shù)訓(xùn)練輪數(shù)、精度與收斂的真相4.1 訓(xùn)練輪數(shù)和精度不是越多越好“深度學(xué)習(xí) 訓(xùn)練輪數(shù) 精度”是搜索頻率非常高的一組詞。很多人訓(xùn)練時最簡單粗暴的思路就是把epoch增大損失降不下來就繼續(xù)加。其實(shí)訓(xùn)練輪數(shù)epoch和精度之間并不是單調(diào)關(guān)系甚至跑著跑著精度不升反降這叫做過擬合。舉個例子我在做缺陷檢測項(xiàng)目時驗(yàn)證集精度一開始在epoch 40時達(dá)到巔峰繼續(xù)訓(xùn)練到epoch 100訓(xùn)練集精度還在上升但驗(yàn)證集精度已經(jīng)明顯下跌了。這時候你就知道模型開始把訓(xùn)練集里的噪聲背下來了而不是學(xué)特征。判斷模型是否在“死記硬背”最直觀的辦法是同時監(jiān)控訓(xùn)練損失和驗(yàn)證損失。訓(xùn)練損失降、驗(yàn)證損失升就是過擬合的典型信號。這時候最合適的做法是提前停止Early Stopping或者減小模型容量、加大正則化、數(shù)據(jù)增強(qiáng)。4.2 學(xué)習(xí)率、批大小和優(yōu)化器的默契配合學(xué)習(xí)率可以說是訓(xùn)練里最敏感的一個參數(shù)。它太小模型訓(xùn)練龜速它太大loss會出現(xiàn)震蕩甚至直接發(fā)散成NaN。很多教程建議用0.001這只是一個比較通用的起點(diǎn)具體要根據(jù)數(shù)據(jù)量和任務(wù)復(fù)雜度去調(diào)整。調(diào)參時我有一個個人偏好先用一個較小的batch size比如16或32來跑通整個流程確認(rèn)代碼沒問題了再去調(diào)batch size。batch size變大能加快訓(xùn)練但也會影響模型的泛化能力和收斂曲線過大時甚至需要同步調(diào)大學(xué)習(xí)率才能保持收斂速度。優(yōu)化器方面Adam是很多人的默認(rèn)選擇因?yàn)樗茏詣诱{(diào)整學(xué)習(xí)率適應(yīng)不同參數(shù)的更新步長。但在調(diào)參排查問題時我會先換回SGD配合momentum試試因?yàn)镾GD對學(xué)習(xí)率的響應(yīng)更線性更容易定位是否學(xué)習(xí)率設(shè)置有問題。這只是個人習(xí)慣但實(shí)測下來對排查問題很有效。4.3 從“精度不漲”反推訓(xùn)練問題的清單如果訓(xùn)練了一堆epoch損失值幾乎不動我建議按下面的順序排查先看數(shù)據(jù)。標(biāo)簽是否正確圖片是否被錯誤讀取歸一化參數(shù)是否寫錯了。數(shù)據(jù)問題往往是最隱形、也是最難想到的。再看網(wǎng)絡(luò)輸入輸出。輸出層維度和損失函數(shù)是否匹配激活函數(shù)是否寫錯。接著看優(yōu)化器。梯度是否在更新把模型的參數(shù)打印出來看一眼如果訓(xùn)練前后參數(shù)根本沒變大概率是梯度沒回傳成功。最后看學(xué)習(xí)率和batch size。學(xué)習(xí)率太小或batch size太極端都會導(dǎo)致收斂緩慢。4.4 反向傳播與CNN到底在學(xué)什么很多初學(xué)者提到反向傳播就覺得難其實(shí)它就是一個“鏈?zhǔn)椒▌t”的應(yīng)用。網(wǎng)絡(luò)把輸入算出一個預(yù)測結(jié)果跟真實(shí)標(biāo)簽比較得到損失然后從最后一層往前一層層地計(jì)算每一層參數(shù)的“鍋”有多大誰對最終損失貢獻(xiàn)大誰就多做調(diào)整。CNN卷積神經(jīng)網(wǎng)絡(luò)的核心思路也簡單通過一層層卷積核去提取圖像的局部特征。開始時學(xué)習(xí)邊緣、顏色中間層學(xué)習(xí)形狀、紋理深層才能看到更抽象的結(jié)構(gòu)。這也解釋了一個現(xiàn)象如果數(shù)據(jù)量太少CNN很難學(xué)到有意義的高層特征模型再好也沒用。理解了反向傳播和CNN的學(xué)習(xí)方式你在看訓(xùn)練曲線時心里就會有數(shù)知道loss下降趨勢是正常的還是異常的這套直覺在后期排查問題時能幫大忙。5. 樣本很少怎么訓(xùn)練數(shù)據(jù)增強(qiáng)、遷移學(xué)習(xí)與標(biāo)注實(shí)戰(zhàn)5.1 深度學(xué)習(xí)樣本數(shù)量少的缺點(diǎn)深度學(xué)習(xí)本質(zhì)上是個“數(shù)據(jù)驅(qū)動”的方法樣本數(shù)量少帶來的直接問題有三個訓(xùn)練不穩(wěn)定、易過擬合、泛化能力差。比如圖像分類如果每個類別只有幾十張圖網(wǎng)絡(luò)很容易把某一類別的背景當(dāng)成特征換了一組環(huán)境光就不認(rèn)識了。解決樣本不足的常用思路有三類數(shù)據(jù)增強(qiáng)、遷移學(xué)習(xí)和合成數(shù)據(jù)。它們可以單獨(dú)用也可以組合使用效果往往不錯。5.2 數(shù)據(jù)增強(qiáng)讓“一張圖”變出“十張圖”數(shù)據(jù)增強(qiáng)是成本最低、效果最直接的方案。以圖像分類為例平移、縮放、旋轉(zhuǎn)、翻轉(zhuǎn)、裁剪、亮度調(diào)整、噪聲注入這些操作不會改變圖片的語義標(biāo)簽卻能讓模型看到更多樣式的輸入從而提升泛化能力。在PyTorch里利用torchvision.transforms可以很輕松地實(shí)現(xiàn)數(shù)據(jù)增強(qiáng)管道from torchvision import transforms transform transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])值得注意的是增強(qiáng)不是無限制的。過度旋轉(zhuǎn)、過度裁剪會把有效信息也裁掉反而讓模型學(xué)不到關(guān)鍵特征。一般旋轉(zhuǎn)角度控制在10-20度以內(nèi)翻轉(zhuǎn)和裁剪也都要結(jié)合真實(shí)場景來考慮比如工業(yè)定位場景里樣本的倒置就未必合理。5.3 遷移學(xué)習(xí)站在預(yù)訓(xùn)練模型的肩膀上樣本少時另一個好方案是遷移學(xué)習(xí)。用在大規(guī)模數(shù)據(jù)集上預(yù)訓(xùn)練好的模型比如ImageNet上訓(xùn)練過的ResNet、EfficientNet作為特征提取器只替換最后的全連接層然后在自己的小數(shù)據(jù)集上微調(diào)。前幾層的卷積特征基本是通用的小樣本也夠了需要學(xué)習(xí)的主要是任務(wù)相關(guān)的最后一層。微調(diào)時我建議分兩步走先把backbone凍結(jié)只訓(xùn)練分類頭等loss降得比較平穩(wěn)了再解凍一部分backbone層用很小的學(xué)習(xí)率繼續(xù)訓(xùn)練。這樣既能加速收斂又能減少過擬合。5.4 標(biāo)注工具與批量處理工作流做工業(yè)檢測或語義分割項(xiàng)目標(biāo)注往往是比訓(xùn)練更耗時的事情。Halcon自帶的深度學(xué)習(xí)標(biāo)注工具能框目標(biāo)框和像素級標(biāo)注適合工業(yè)視覺通用場景下開源工具LabelImg適合目標(biāo)檢測的矩形框標(biāo)注Labelme適合多邊形分割標(biāo)注EISeg在交互式分割標(biāo)注上體驗(yàn)也不錯。批量處理圖像時先統(tǒng)一圖像的尺寸、格式、命名規(guī)則再做歸一化這樣能大大減少后續(xù)訓(xùn)練的隱性錯誤。我習(xí)慣在預(yù)處理階段就把所有圖像Resize到統(tǒng)一尺寸同時保存一份標(biāo)注信息的映射表方便排查。6. 部署與落地從缺陷檢測到移動端的完整閉環(huán)6.1 圖像分類與缺陷檢測的模型選擇回到熱搜里那個“缺陷圖片深度學(xué)習(xí)模型那種最好”的問題。這類問題沒有一個標(biāo)準(zhǔn)答案因?yàn)椴煌毕荨⒉煌馁|(zhì)、不同檢測速度要求選型完全不同。如果是簡單的表面缺陷分類比如區(qū)分劃痕、污漬、正常用ResNet或EfficientNet做分類器就能解決如果需要在圖像里定位缺陷位置那就要用目標(biāo)檢測模型輕量場景用YOLO系列精度場景用Faster R-CNN系列如果不光要定位還要精確分割出缺陷區(qū)域那就得用語義分割模型比如U-Net、DeepLabV3。在工業(yè)現(xiàn)場部署時往往還要求檢測速度。把EfficientNet換成MobileNet、把YOLO換輕量版本精度可能會略有下降但吞吐量能提升不少。具體怎么平衡要看項(xiàng)目需求。6.2 語音去噪與人聲抑制的深度學(xué)習(xí)思路語音去噪是另一個高頻場景。經(jīng)典的方法是把帶噪語音經(jīng)短時傅里葉變換得到頻譜再用網(wǎng)絡(luò)預(yù)測干凈的幅度譜或掩碼。近年實(shí)做中大多數(shù)人更傾向用“時域端到端”的方案比如Conv-TasNet、Demucs直接在波形層面做去噪減少了時頻變換過程中的信息損失。人聲抑制本質(zhì)上可以看作一個語音分離任務(wù)網(wǎng)絡(luò)目標(biāo)是把人聲和背景聲分離成兩個流。用語音增強(qiáng)模型做預(yù)處理前面配合一個VAD檢測能有效提升下游語音識別或通話的清晰度。實(shí)踐時要注意訓(xùn)練數(shù)據(jù)的噪聲類型必須跟應(yīng)用環(huán)境匹配否則在真實(shí)環(huán)境里效果會打折扣。6.3 深度估計(jì)與視頻目標(biāo)跟蹤的工程化落地基于深度學(xué)習(xí)的深度估計(jì)、視頻目標(biāo)跟蹤聽起來很“高大上”工程化時也逃不開幾個共同的現(xiàn)實(shí)問題。深度估計(jì)模型推算出的深度圖往往需要后處理比如中值濾波、空洞填充才能滿足下游建模需求。視頻目標(biāo)跟蹤則要特別關(guān)注“目標(biāo)丟失”后的恢復(fù)策略單純依賴跟蹤器本身很容易跟丟很多實(shí)際項(xiàng)目都會在跟蹤后接一個重檢測模塊。這些應(yīng)用跑通Demo容易部署時卻會遇到不少性能瓶頸。模型壓縮、剪枝、蒸餾、TensorRT加速是常見的優(yōu)化手段。先把模型的推理延遲壓到實(shí)時線以內(nèi)再談其他優(yōu)化才有意義。6.4 微信小程序運(yùn)行深度學(xué)習(xí)模型的輕量化路徑在微信小程序里跑深度學(xué)習(xí)模型已經(jīng)可以使用端側(cè)推理引擎了。通用流程是用PyTorch訓(xùn)練模型導(dǎo)出為ONNX再把ONNX轉(zhuǎn)成端側(cè)引擎支持的格式。這里有個隱蔽的坑端側(cè)推理對算子支持有限不是所有網(wǎng)絡(luò)層都能轉(zhuǎn)成端側(cè)推理格式。比如某些注意力機(jī)制的實(shí)現(xiàn)用到了非常高階的算子導(dǎo)出時會報(bào)錯或運(yùn)行不支持。應(yīng)對辦法是先確認(rèn)模型里每個算子都能被端側(cè)引擎支持否則就要做結(jié)構(gòu)替換或簡化比如把全局注意力改成可分解的形式或者退而使用MobileNet這種對移動端友好的結(jié)構(gòu)。6.5 云平臺訓(xùn)練與本地部署的分工訓(xùn)練和部署分開是很多團(tuán)隊(duì)的常態(tài)。本地用單人GPU做數(shù)據(jù)分析和調(diào)參大任務(wù)放到云平臺上跑。云平臺的GPU配額調(diào)度、存儲掛載、任務(wù)腳本管理都可以做成一套標(biāo)準(zhǔn)化流程讓團(tuán)隊(duì)成員不用重復(fù)造輪子。有一個建議不管本地還是云端訓(xùn)練腳本里一定要固化隨機(jī)種子把數(shù)據(jù)讀取順序、模型初始化參數(shù)都固定下來這樣每次訓(xùn)練的結(jié)果才可復(fù)現(xiàn)。否則同一個腳本跑兩次得到完全不同的結(jié)果像霧里看花。7. 寫在后面一個工具包解決不了所有問題DeepLearningToolbox這個詞從Matlab當(dāng)年的教學(xué)工具箱到后來官方整合的深度學(xué)習(xí)工具鏈再到今天各種行業(yè)軟件里內(nèi)嵌的深度學(xué)習(xí)模塊走過了很長的路。它能幫你省去不少造輪子的功夫但它終究只是一個“工具”真正決定項(xiàng)目成敗的還是你對數(shù)據(jù)的理解、對訓(xùn)練過程的洞察以及對業(yè)務(wù)場景的把握。最后分享一句我常對團(tuán)隊(duì)同事說的話學(xué)習(xí)深度學(xué)習(xí)最快的路線不是不停地?fù)Q新工具而是選定一條路線把它啃透多踩幾個坑多記下幾個“為什么”。這些經(jīng)驗(yàn)和判斷任何平臺和時間都無法替代正是你真正值錢的地方。本文還有配套的精品資源點(diǎn)擊獲取