Fastai-竞赛实战
競賽實戰(zhàn)
簡介
可以說,Fastai的出現(xiàn)給Kaggle上很多以遷移學(xué)習(xí)為主的比賽帶來了新的方法,沖擊了很多傳統(tǒng)框架,因為Fastai的封裝更多更詳細(xì),使用者更方便。本文以一個簡單的分類賽為例,介紹如何在Kaggle中使用Fastai取得不錯的成績。本文只列舉代碼的細(xì)節(jié),主要是Fastai解決視覺問題的Pipeline,具體框架用法不多設(shè)計,我的系列博客已經(jīng)具體講解了。
賽題
比賽鏈接,老生常談的MNIST手寫體分類,是Kaggle上一個入門級別的賽事,關(guān)于Kaggle賽事級別類型等可以參考我的博客。
由于給出的數(shù)據(jù)集為表格數(shù)據(jù),預(yù)先處理為了本地的JPG圖片并按照ImageNet數(shù)據(jù)集的風(fēng)格進(jìn)行文件存儲,方便Fastai
讀取。
數(shù)據(jù)準(zhǔn)備
本地數(shù)據(jù)集的存放格式如下。
mnist\train\0\1\2\...9\test\Fastai要讀取這個數(shù)據(jù)集非常簡單,使用ImageDataBunch的from_folder方法即可,讀取之后這里按照ImageNet的統(tǒng)計信息進(jìn)行了標(biāo)準(zhǔn)化。
tfms = transform.get_transforms(do_flip=False, max_rotate=5.0) # 數(shù)據(jù)變換db = ImageDataBunch.from_folder("../train/",test="../test/",valid_pct=0.15, # 劃分訓(xùn)練集bs=64,size=224,ds_tfms=tfms, ) db = db.normalize(imagenet_stats)得到的數(shù)據(jù)集輸出信息如下。
ImageDataBunch;Train: LabelList (35700 items) x: ImageList Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224) y: CategoryList 5,5,5,5,5 Path: ../train;Valid: LabelList (6300 items) x: ImageList Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224) y: CategoryList 5,9,9,9,0 Path: ../train;Test: LabelList (28000 items) x: ImageList Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224) y: EmptyLabelList ,,,, Path: ../train學(xué)習(xí)器構(gòu)建
通過cnn_learner方法根據(jù)resnet模型構(gòu)建學(xué)習(xí)器并采用在Imagenet上預(yù)訓(xùn)練的參數(shù),成功構(gòu)建學(xué)習(xí)器。
learn = learner.cnn_learner(db, models.wide_resnet50_2, metrics=[accuracy, ], model_dir="/tmp/models", callback_fns=ShowGraph)上面設(shè)置了數(shù)據(jù)集、模型、指標(biāo)、模型存放地址以及預(yù)先添加的回調(diào),這種回調(diào)添加方式表示自動依據(jù)當(dāng)前l(fā)earner創(chuàng)建默認(rèn)參數(shù)的回調(diào)對象而不必像fit時那樣初始化對象,通常,這種方法更加普遍。
模型訓(xùn)練
首先通過LR_Finder來搜索合適的學(xué)習(xí)率(只需要調(diào)用學(xué)習(xí)器的lr_find方法),最后確定了合適的學(xué)習(xí)率區(qū)間。
learn.unfreeze() # 解凍所有層 learn.lr_find() # 迭代找尋最優(yōu)學(xué)習(xí)率 learn.recorder.plot()接著,按照合適的學(xué)習(xí)率區(qū)間使用one cycle策略進(jìn)行50輪的訓(xùn)練(解凍所有層),結(jié)果如下。
推理分析
利用learner生成解釋器,可視化識別最差的圖片以及混淆矩陣。
interpreter.plot_top_losses(6) interpreter.plot_confusion_matrix()然后,進(jìn)行測試集上的結(jié)果推理,這里注意的是數(shù)據(jù)集讀取的API不是按照要求輸出的編號順序來的,是亂序的,輸出的時候要糾正順序再寫入提交的csv文件。
score, y = learn.get_preds(fastai.vision.DatasetType.Test) lab = np.argmax(score, axis=1) Id = [int(os.path.splitext(filename)[0]) + 1 for filename in os.listdir(test_folder)] # 還原id df_submit['ImageId'] = Id df_submit['Label'] = lab結(jié)果提交
得到了合適的CSV文件就可以在平臺上進(jìn)行提交,平臺很快會給出public測試的分?jǐn)?shù),本比賽采用的是準(zhǔn)確率作為指標(biāo),上述數(shù)十行代碼獲得的得分為0.99700,排名為161/2292,而這只是一個baseline代碼,這說明,fastai在比賽這個領(lǐng)域是非常實用的框架,且它支持PyTorch的一切功能,對PyTorch的用戶也非常友好。
補(bǔ)充說明
本文主要演示了使用Fastai在比賽中如何構(gòu)建一個Pipeline的baseline,具體代碼開源于我的Github,歡迎star或者fork。
總結(jié)
以上是生活随笔為你收集整理的Fastai-竞赛实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fastai-学习器训练
- 下一篇: 深度学习项目-神经元结构可视化