Baseline跑通遇到的問(wèn)題以及解決方案:
import cupy報(bào)錯(cuò)
一開始采用的是pip install cupy-cuda110安裝成功后但是報(bào)如上圖所示的錯(cuò),后改用conda安裝成功础芍,安裝命令為conda install -c conda-forge cupy cudatoolkit=11.0杈抢。注意安裝CUDA對(duì)應(yīng)的版本。
import StratifiedGroupKFold
import StratifiedGroupKFold報(bào)錯(cuò)顯示ImportError: cannot import name 'StratifiedGroupKFold' from 'sklearn.model_selection'仑性。后更新了scikit-learnd的版本后運(yùn)行成功惶楼。
運(yùn)行成功顯示如下:
Baseline框架以及改進(jìn)想法:
模型
Baseline模型采用的是Unet原始結(jié)構(gòu),backbone采用的是efficientnet-b1诊杆。
在Baseline中使用了segmentation_models_pytorch包歼捐,其可支持的結(jié)構(gòu)如下。一般顯示效果不錯(cuò)的是Unet和FPN晨汹。也可以嘗試一些新的Unet結(jié)構(gòu)比如TransUnet和SwinUnet豹储,但是segmentation_models_pytorch暫不支持。
改進(jìn)想法:模型是性能的下限淘这,好的模型就有好的開始剥扣。Unet是在語(yǔ)義分割尤其是醫(yī)學(xué)語(yǔ)義分割里比較好的模型,我所接觸的醫(yī)學(xué)語(yǔ)義分割大都是以Unet為基準(zhǔn)進(jìn)行一些魔改操作铝穷,包括:
1.Backbone的選擇:目前最常用就是EfficientNet系列钠怯、ResNet系列、ResNeXt系列曙聂,Baseline中采用的是efficientnet-b1晦炊,從b2-b5都可以嘗試。ResNeXt可以達(dá)到與EfficientNet相近的效果。Inception和Mobilenet也是常用的Backbone刽锤。一般會(huì)基于不同backbone的模型進(jìn)行集成預(yù)測(cè)镊尺。
2.在Unet中加入其他模塊:ASPP(空洞卷積)、Hypercolumn并思、以及CBAM和SCSE這種注意力模塊庐氮。segmentation_models_pytorch支持部分操作但是高度集成不適合修改,可以下載segmentation_models_pytorch的源碼進(jìn)行自主的模塊添加宋彼。
損失函數(shù)
Baseline中采用的是BCELoss和TverskyLoss弄砍,語(yǔ)義分割中可以采用的損失如下所示:
改進(jìn)想法:常見(jiàn)有效的損失包括BCELoss、DICEloss输涕、BCELoss+DICEloss音婶,其中Lovaszloss有的時(shí)候有奇效,對(duì)于Lovaszloss的改進(jìn)網(wǎng)上也有現(xiàn)成的方法莱坎。Focal Loss可以針對(duì)樣本不平衡的情況并進(jìn)行難例挖掘衣式。好的損失可以帶來(lái)不小的提升。
訓(xùn)練
1.Baseline采用的優(yōu)化器是Adam檐什,Adam的好處是不用特別關(guān)注怎么調(diào)整學(xué)習(xí)率碴卧,3e-4號(hào)稱是Adam最好的初始學(xué)習(xí)率。但是如果可以好的調(diào)整學(xué)習(xí)率乃正,SGD號(hào)稱可以在Adam的基礎(chǔ)上提升性能住册。lr_find()提供了一種尋找最優(yōu)初始學(xué)習(xí)率的方式。
2.Baseline學(xué)習(xí)率調(diào)整策略StepLR瓮具,衰減位置的確定需要一定的經(jīng)驗(yàn)和感覺(jué)荧飞,可以根據(jù)驗(yàn)證loss的走勢(shì)調(diào)整衰減位置。Warmup + Cosine也是一種常用的學(xué)習(xí)率調(diào)整策略名党,每個(gè)iteration逐漸增大至初始學(xué)習(xí)率叹阔,然后余弦下降至終止學(xué)習(xí)率。CosineAnnealingLR+Snapshot Ensembles是一個(gè)循環(huán)衰減學(xué)習(xí)率獲得不同局部最優(yōu)模型的集成策略传睹。
3.Batchsize和分辨率大小也是可以調(diào)整的訓(xùn)練參數(shù)条获。一般Batchsize都不會(huì)選擇不合理。圖像輸入的分辨率大小對(duì)于模型也很關(guān)鍵蒋歌,我遇到過(guò)不同分辨率模型的集成預(yù)測(cè)方案∥海或者堂油,在訓(xùn)練期間進(jìn)行多尺度訓(xùn)練,然后測(cè)試的時(shí)候選取其中某幾個(gè)尺度表現(xiàn)優(yōu)異的預(yù)測(cè)結(jié)果出來(lái)融合碧绞,提升模型對(duì)多尺度的魯棒府框。
數(shù)據(jù)預(yù)處理和后處理
該部分最能體現(xiàn)比賽目標(biāo)相關(guān),決定性能的上限讥邻。好的預(yù)處理和后處理帶來(lái)的提升很大迫靖。
1. Baseline采用的數(shù)據(jù)增強(qiáng)策略:
對(duì)數(shù)據(jù)增強(qiáng)的改進(jìn)沒(méi)有固定的策略院峡,依賴于一些經(jīng)驗(yàn)和直覺(jué)。比較重要的是可以對(duì)模型預(yù)測(cè)中的bad case做針對(duì)性的調(diào)整系宜。 還有一些針對(duì)大圖像需要切割成patch的各種策略照激,目前來(lái)看應(yīng)該不適用于本數(shù)據(jù)集。使用額外數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練也是常見(jiàn)的方法盹牧,但是額外數(shù)據(jù)集不容易獲得俩垃。
2.后處理中有一些通用的技巧:包括TTA(將同一圖像進(jìn)行不同幾何變換后預(yù)測(cè),將預(yù)測(cè)結(jié)果變換回來(lái)后取預(yù)測(cè)平均值)汰寓、集成預(yù)測(cè)(TTA也屬于集成預(yù)測(cè)口柳,還包括訓(xùn)練不同模型得到不同的預(yù)測(cè),預(yù)測(cè)結(jié)果可以投票或者取平均有滑,或者采用stacking的方式跃闹,利用機(jī)器學(xué)習(xí)模型對(duì)預(yù)測(cè)進(jìn)行訓(xùn)練后得到集成預(yù)測(cè)結(jié)果)。
3.利用偽標(biāo)簽進(jìn)行半監(jiān)督學(xué)習(xí)毛好,變相擴(kuò)增數(shù)據(jù)集望艺。有時(shí)有效有時(shí)過(guò)擬合,需要謹(jǐn)慎使用睛榄。如果驗(yàn)證集或者測(cè)試集出現(xiàn)了訓(xùn)練集沒(méi)有的樣本種類荣茫,該方法更可能有效。比較安全的方法是:(1)篩選預(yù)測(cè)置信度高的樣本作為偽標(biāo)簽场靴,如分類里啡莉,再test里的預(yù)測(cè)概率是大于0.9的,則視為正確的預(yù)測(cè)旨剥,此時(shí)將其作為偽標(biāo)簽來(lái)使用咧欣。(2)幫第一次的偽標(biāo)簽扔進(jìn)去訓(xùn)練集一起訓(xùn)練后,得到新的模型轨帜,按相同的規(guī)則再次挑一次偽標(biāo)簽出來(lái)魄咕。(3)如此不斷循環(huán)多次,置信度的閾值可以適當(dāng)作調(diào)整蚌父。實(shí)際使用中可能沒(méi)那么復(fù)雜只進(jìn)行了第一步哮兰。
4.一些新穎的或者針對(duì)本次比賽的idea可以從kaggle的討論區(qū)獲得,經(jīng)常會(huì)有一些不錯(cuò)的想法苟弛。