訂閱
糾錯
加入自媒體

使用 Fast ai 進(jìn)行圖像分類

介紹

從頭開始訓(xùn)練深度學(xué)習(xí)模型可能是一項乏味的任務(wù)。你必須找到正確的訓(xùn)練權(quán)重,獲得最佳學(xué)習(xí)率,找到最佳超參數(shù)以及最適合你的數(shù)據(jù)和模型的架構(gòu)。再加上沒有足夠的質(zhì)量數(shù)據(jù)來訓(xùn)練,以及它需要的計算強度會對我們的資源造成嚴(yán)重?fù)p失,這些因素在第一輪就把你擊倒。但不要害怕,因為 Fast.a(chǎn)i 等深度學(xué)習(xí)庫會充當(dāng)我們強有力的助手,讓你立即重返賽場。

目錄

1. Fast.a(chǎn)i概述

2. 我們?yōu)槭裁匆褂?Fast.a(chǎn)i?

· 圖像數(shù)據(jù)包

· LR 查找

· fit_one_cycle

3. 案例研究:緊急與非緊急車輛分類

Fast.a(chǎn)i概述

Fast.a(chǎn)i 是建立在 PyTorch 之上的流行深度學(xué)習(xí)框架。它旨在通過幾行代碼快速輕松地構(gòu)建最先進(jìn)的模型。它極大地簡化了深度學(xué)習(xí)模型的訓(xùn)練過程,而不會影響訓(xùn)練模型的速度、靈活性和性能。Fast.a(chǎn)i 也支持計算機視覺和 NLP 中最先進(jìn)的技術(shù)和模型。

我們?yōu)槭裁匆褂?Fast.a(chǎn)i?

除了 Fast.a(chǎn)i 模型的高生產(chǎn)力和易用性之外,它還確保了我們能夠自定義高級 API 而無需干預(yù)較低級的 API。Fast.a(chǎn)i 還包含一些非常酷的功能,使其成為初學(xué)者最喜歡的深度學(xué)習(xí)庫之一。

圖像數(shù)據(jù)包

圖像數(shù)據(jù)包有助于匯集我們的訓(xùn)練、驗證和測試數(shù)據(jù),并通過執(zhí)行所有必需的轉(zhuǎn)換和標(biāo)準(zhǔn)化圖像數(shù)據(jù)來處理數(shù)據(jù)。

LR 查找

學(xué)習(xí)率會影響我們的模型學(xué)習(xí)和適應(yīng)問題的速度。低學(xué)習(xí)率會減慢訓(xùn)練過程的收斂速度,而高學(xué)習(xí)率會導(dǎo)致性能出現(xiàn)令人不快的分歧。

因此,良好的學(xué)習(xí)率對于模型的令人滿意的性能至關(guān)重要,而找到最佳學(xué)習(xí)率就像大海撈針一樣。Fast.a(chǎn)i 的“l(fā)r_find()”是我們的騎士,它將我們從尋找合適學(xué)習(xí)率的痛苦中解救出來。

recorder.plot()

lr_find() 的工作原理是最初使用非常低的學(xué)習(xí)率來訓(xùn)練小批量數(shù)據(jù)并計算損失。然后它以比前一個稍高的學(xué)習(xí)率訓(xùn)練下一個小批量。這個過程一直持續(xù)到我們到達(dá)一個合適的學(xué)習(xí)率。我們可以使用 recorder.plot() 來獲取學(xué)習(xí)率與 Loss 的圖,這簡化了選擇良好的學(xué)習(xí)率的任務(wù)。選擇學(xué)習(xí)率的依據(jù)是哪個學(xué)習(xí)率為我們的損失提供了最陡的斜率,而不是哪個學(xué)習(xí)率的損失最低。

fit_one_cycle

fit_one_cycle 方法實現(xiàn)了循環(huán)學(xué)習(xí)率的概念。在這種方法中,我們使用在最小和最大界限值之間波動的學(xué)習(xí)率,而不是使用固定或指數(shù)下降的學(xué)習(xí)率。

循環(huán)學(xué)習(xí)率。訓(xùn)練神經(jīng)網(wǎng)絡(luò)的循環(huán)學(xué)習(xí)率 - https://arxiv.org/pdf/1506.01186.pdf

CLR 中的每個循環(huán)由 2 個步驟組成,其中學(xué)習(xí)率從最小值增加到最大值,下一步反之亦然。假設(shè)最佳學(xué)習(xí)率位于所選的最小值和最大值之間。這里,步長表示用于增加或減少每一步的學(xué)習(xí)率的迭代次數(shù)。

我們使用循環(huán)學(xué)習(xí)率,通過循環(huán)數(shù)來擬合我們的模型。學(xué)習(xí)率在訓(xùn)練期間的每個循環(huán)中在所選的最小學(xué)習(xí)率到最大學(xué)習(xí)率之間振蕩。CLR 的使用消除了我們的訓(xùn)練模型陷入鞍點的可能性。

fit_one_cycle 方法還實現(xiàn)了學(xué)習(xí)率 Annealing 的概念,我們在最后幾次迭代中使用減少的 LR。最后一次迭代的學(xué)習(xí)率通常取為所選最小學(xué)習(xí)率的百分之一。這可以防止在我們接近它時超出最優(yōu)值。

案例研究:緊急與非緊急車輛分類

讓我們嘗試使用 Fast.a(chǎn)i 在 Imagenets 數(shù)據(jù)集中使用預(yù)訓(xùn)練的 Resnet50 模型解決緊急與非緊急車輛分類問題。

導(dǎo)入模塊

from fastai.vision import *

from fastai.vision.models import resnet50

使用 ImageDataBunch 進(jìn)行數(shù)據(jù)增強

tfms = get_transforms(do_flip=True, flip_vert=True, max_rotate=50, max_lighting=0.1, max_warp=0 )

data = ImageDataBunch.from_df('/content/drive/MyDrive/CV_Vehicle_classification/train_data/images', train, ds_tfms=tfms, label_delim= None, valid_pct=0.2, fn_col=0, label_col=1 , size=299,bs=64).normalize(imagenet_stats)

模型訓(xùn)練

t_cnn1 = cnn_learner(data, resnet50, pretrained=True, metrics=[accuracy])

t_cnn1.fit_one_cycle(5)

最初,讓我們使用fit_one_cycle 訓(xùn)練我們的模型 5 個時期。這是為了了解模型的工作原理。

使用 fit_one_cycle() 進(jìn)行模型訓(xùn)練

在這里,驗證損失遠(yuǎn)小于訓(xùn)練損失。這表明我們的模型擬合不足,與我們需要的模型相去甚遠(yuǎn)。

解凍圖層(unfreeze)

讓我們解凍預(yù)訓(xùn)練模型的層。這樣做是為了讓我們的模型學(xué)習(xí)特定于我們數(shù)據(jù)集的特征。我們再次擬合我們的模型,看看模型現(xiàn)在是如何工作的。

t_cnn1.unfreeze()

t_cnn1.fit_one_cycle(8)

解凍圖層并訓(xùn)練模型

學(xué)習(xí)率查找器

使用 lr_find 和 recorder.plot,我們將能夠清楚地了解哪種學(xué)習(xí)率最適合我們的模型。利用學(xué)習(xí)率與損失圖來選擇學(xué)習(xí)率。

t_cnn1.lr_find()

t_cnn1.recorder.plot()

針對損失圖的學(xué)習(xí)率

可以看到 1e-4 之后的損失逐漸增加。因此,將初始層的學(xué)習(xí)率選擇為 1e-5,將后面的層選擇為 1e-4 將是一個明智的想法。

我們再次擬合我們的方法并使用選擇的學(xué)習(xí)率對其進(jìn)行訓(xùn)練。該模型稍后會被凍結(jié)并導(dǎo)出以供以后使用。

t_cnn1.fit_one_cycle(10,max_lr=slice(1e-5, 1e-4))

t_cnn1.freeze()

t_cnn1.export('/content/drive/MyDrive/CV_Vehicle_classification/model/Bmodel_fastai_resnet50.h5')

訓(xùn)練和凍結(jié)模型

fit_one_cycle() 中的切片用于實現(xiàn)判別學(xué)習(xí)。它基本上告訴模型以 1e-5 的學(xué)習(xí)率訓(xùn)練初始層,以 1e-4 的學(xué)習(xí)率訓(xùn)練最終層,以及它們之間的層,其值介于這兩個學(xué)習(xí)率之間。

預(yù)測

完成所有模型訓(xùn)練后,我們只剩下預(yù)測測試數(shù)據(jù)集的任務(wù)了,F(xiàn)在讓我們加載我們之前導(dǎo)出的測試數(shù)據(jù)和 Resnet50 模型,并使用它來預(yù)測我們的測試數(shù)據(jù)。

test_data = ImageList.from_df(test, cols=['image_names'], path='/content/drive/MyDrive/CV_Vehicle_classification/train_data/images')

t_rn50 = load_learner('/content/drive/MyDrive/CV_Vehicle_classification/model/', 'Bmodel_fastai_resnet50.h5', test = test_data)

y_trn50 = t_rn50.TTA(ds_type = DatasetType.Test)
preds = y_trn50[0].a(chǎn)rgmax(-1)

尾注

瞧!我們現(xiàn)在已經(jīng)預(yù)測了我們的測試數(shù)據(jù),而無需花費大量時間來建立一個更大的訓(xùn)練數(shù)據(jù)集、設(shè)計和訓(xùn)練我們的深度學(xué)習(xí)模型,也不會完全耗盡我們的計算資源。

       原文標(biāo)題 : 使用 Fast ai 進(jìn)行圖像分類

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號