一行命令跑評(píng)測(cè),港中文MMLab開源自監(jiān)督表征學(xué)習(xí)代碼庫(kù)OpenSelfSup
自監(jiān)督表征學(xué)習(xí)發(fā)展迅速,但也存在諸多問(wèn)題。近日,香港中文大學(xué)多媒體實(shí)驗(yàn)室(MMLab)和南洋理工大學(xué)的研究者開源了一套統(tǒng)一的自監(jiān)督學(xué)習(xí)代碼庫(kù) OpenSelfSup。
前言
近幾個(gè)月來(lái)自監(jiān)督表征學(xué)習(xí)領(lǐng)域獲得了顯著突破,特別是隨著 Rotation Prediction、DeepCluster、MoCo、SimCLR 等簡(jiǎn)單有效的方法的誕生,自監(jiān)督表征學(xué)習(xí)大有超越有監(jiān)督表征學(xué)習(xí)的趨勢(shì)。
然而,做這個(gè)領(lǐng)域的研究者都深有感觸:1)自監(jiān)督任務(wù)復(fù)雜而多樣,不同方法各有各的專用訓(xùn)練代碼,難以結(jié)合、復(fù)用和改進(jìn);2)評(píng)價(jià)方案不統(tǒng)一,不同的方法難以在公平環(huán)境下對(duì)比;3)動(dòng)輒百萬(wàn)千萬(wàn)的訓(xùn)練數(shù)據(jù)量,訓(xùn)練效率是個(gè)大問(wèn)題。
針對(duì)這些問(wèn)題,香港中文大學(xué)多媒體實(shí)驗(yàn)室(MMLab)和南洋理工大學(xué)的研究者最近開源了一套統(tǒng)一的自監(jiān)督學(xué)習(xí)代碼庫(kù):OpenSelfSup。
開源地址:https://github.com/open-mmlab/OpenSelfSup
OpenSelfSup
統(tǒng)一的代碼框架和模塊化設(shè)計(jì)
OpenSelfSup 使用 PyTorch 實(shí)現(xiàn),支持基于分類、重建、聚類、memory bank、contrastive learning 的多種自監(jiān)督學(xué)習(xí)框架,目前收錄了 Relative Location、Rotation Prediction、DeepCluster、OnlineDeepCluster、NPID、MoCo、SimCLR 等一系列表現(xiàn)較好的自監(jiān)督表征學(xué)習(xí)方法,后續(xù)還將陸續(xù)跟進(jìn)學(xué)術(shù)界最新算法。
在這個(gè)框架下,每個(gè)算法被拆解為 backbone、neck、head、memory_bank (optional)、hook (optional) 等多個(gè)可獨(dú)立設(shè)計(jì)的模塊,每個(gè)模塊均提供多個(gè)可選方案,開發(fā)者也可以自行設(shè)計(jì)各個(gè)模塊。
SimCLR 中的 backbone、neck 和 head 設(shè)計(jì)
標(biāo)準(zhǔn)化的評(píng)測(cè)方案
OpenSelfSup 目前支持 ImageNet/Place205 Linear Classification、ImageNet Semi-Supervised Classification、PASCAL VOC07 Linear SVM、PASCAL VOC / COCO Object Detection 等多個(gè)基準(zhǔn)的評(píng)測(cè)方案,可以做到一行命令跑評(píng)測(cè),非常方便。
高效率的分布式訓(xùn)練
OpenSelfSup 收錄的算法全部實(shí)現(xiàn)了多機(jī)多卡的分布式訓(xùn)練、提特征和測(cè)試。
上手容易
該代碼庫(kù)的環(huán)境配置、數(shù)據(jù)配置均有 from scratch 的腳本或詳細(xì)指導(dǎo),簡(jiǎn)單易行。訓(xùn)練和測(cè)試現(xiàn)有算法,只需要一行命令即可搞定。
高度靈活性和可擴(kuò)展性
1. 改進(jìn)現(xiàn)有算法。OpenSelfSup 用 config 文件來(lái)定義各種參數(shù)和模塊,方便修改。config 中還支持一些較復(fù)雜的調(diào)整,比如 data augmentation 的組合、learning rate schedule、獨(dú)立調(diào)整某些網(wǎng)絡(luò)參數(shù)的優(yōu)化參數(shù)等。例如,你希望單獨(dú)調(diào)整 head 中 fully-connected layer 的 momentum 和 learning rate,或者 backbone 中某幾層的 weight decay 等等,那么你可以在 config 中 optimizer: paramwise_option 下用正則表達(dá)式篩選出對(duì)應(yīng)網(wǎng)絡(luò)參數(shù),然后指定這些值,而不需要改動(dòng)代碼。
DeepCluster中指定head(fc layer) 的momentum為0
2. 使用自己的訓(xùn)練數(shù)據(jù)。OpenSelfSup 將數(shù)據(jù)處理和數(shù)據(jù)源解耦。使用自己的訓(xùn)練數(shù)據(jù),只需要新增一個(gè)自己的 data source 文件,并在 config 中指定即可。
3. 設(shè)計(jì)自己的算法。高度模塊化的設(shè)計(jì)使得自行設(shè)計(jì)算法變得非常簡(jiǎn)單。你只需要設(shè)計(jì)自己的模塊或者復(fù)用現(xiàn)有模塊,然后新建一個(gè)模型文件將這些模塊組織起來(lái)即可。如果你的算法包含間隔 iteration、間隔 epoch 的操作(例如 DeepCluster 需要在每個(gè) epoch 結(jié)束后對(duì)訓(xùn)練集做聚類),也只需要新建一個(gè) hook 來(lái)定義這些操作,并在 config 中設(shè)置這個(gè) hook 即可。hook 的調(diào)用是自動(dòng)進(jìn)行的。
DeepCluster 初始聚類和每 n 個(gè) epoch 后做聚類
結(jié)語(yǔ)
OpenSelfSup 是一個(gè)長(zhǎng)期維護(hù)的開源項(xiàng)目,旨在方便學(xué)術(shù)界和工業(yè)屆的研究者推動(dòng)自監(jiān)督表征學(xué)習(xí)領(lǐng)域繼續(xù)前進(jìn)。也希望有興趣的研究者、開發(fā)者幫助繼續(xù)完善 OpenSelfSup,為這個(gè)領(lǐng)域貢獻(xiàn)自己的力量。