訂閱
糾錯(cuò)
加入自媒體

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

介紹

從頭開始訓(xùn)練深度學(xué)習(xí)模型可能是一項(xiàng)乏味的任務(wù)。你必須找到正確的訓(xùn)練權(quán)重,獲得最佳學(xué)習(xí)率,找到最佳超參數(shù)以及最適合你的數(shù)據(jù)和模型的架構(gòu)。再加上沒有足夠的質(zhì)量數(shù)據(jù)來訓(xùn)練,以及它需要的計(jì)算強(qiáng)度會(huì)對(duì)我們的資源造成嚴(yán)重?fù)p失,這些因素在第一輪就把你擊倒。但不要害怕,因?yàn)?Fast.a(chǎn)i 等深度學(xué)習(xí)庫會(huì)充當(dāng)我們強(qiá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)練過程,而不會(huì)影響訓(xùn)練模型的速度、靈活性和性能。Fast.a(chǎn)i 也支持計(jì)算機(jī)視覺和 NLP 中最先進(jìn)的技術(shù)和模型。

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

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

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

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

LR 查找

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

因此,良好的學(xué)習(xí)率對(duì)于模型的令人滿意的性能至關(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ù)并計(jì)算損失。然后它以比前一個(gè)稍高的學(xué)習(xí)率訓(xùn)練下一個(gè)小批量。這個(gè)過程一直持續(xù)到我們到達(dá)一個(gè)合適的學(xué)習(xí)率。我們可以使用 recorder.plot() 來獲取學(xué)習(xí)率與 Loss 的圖,這簡化了選擇良好的學(xué)習(xí)率的任務(wù)。選擇學(xué)習(xí)率的依據(jù)是哪個(gè)學(xué)習(xí)率為我們的損失提供了最陡的斜率,而不是哪個(gè)學(xué)習(xí)率的損失最低。

fit_one_cycle

fit_one_cycle 方法實(shí)現(xiàn)了循環(huán)學(xué)習(xí)率的概念。在這種方法中,我們使用在最小和最大界限值之間波動(dòng)的學(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 中的每個(gè)循環(huán)由 2 個(gè)步驟組成,其中學(xué)習(xí)率從最小值增加到最大值,下一步反之亦然。假設(shè)最佳學(xué)習(xí)率位于所選的最小值和最大值之間。這里,步長表示用于增加或減少每一步的學(xué)習(xí)率的迭代次數(shù)。

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

fit_one_cycle 方法還實(shí)現(xiàn)了學(xué)習(xí)率 Annealing 的概念,我們?cè)谧詈髱状蔚惺褂脺p少的 LR。最后一次迭代的學(xué)習(xí)率通常取為所選最小學(xué)習(xí)率的百分之一。這可以防止在我們接近它時(shí)超出最優(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ù)增強(qiáng)

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 個(gè)時(shí)期。這是為了了解模型的工作原理。

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

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

解凍圖層(unfreeze)

讓我們解凍預(yù)訓(xùn)練模型的層。這樣做是為了讓我們的模型學(xué)習(xí)特定于我們數(shù)據(jù)集的特征。我們?cè)俅螖M合我們的模型,看看模型現(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()

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

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

我們?cè)俅螖M合我們的方法并使用選擇的學(xué)習(xí)率對(duì)其進(jìn)行訓(xùn)練。該模型稍后會(huì)被凍結(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() 中的切片用于實(shí)現(xiàn)判別學(xué)習(xí)。它基本上告訴模型以 1e-5 的學(xué)習(xí)率訓(xùn)練初始層,以 1e-4 的學(xué)習(xí)率訓(xùn)練最終層,以及它們之間的層,其值介于這兩個(gè)學(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ù),而無需花費(fèi)大量時(shí)間來建立一個(gè)更大的訓(xùn)練數(shù)據(jù)集、設(shè)計(jì)和訓(xùn)練我們的深度學(xué)習(xí)模型,也不會(huì)完全耗盡我們的計(jì)算資源。

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

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

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

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

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