使用 Fast ai 進行圖像分類
介紹
從頭開始訓練深度學習模型可能是一項乏味的任務。你必須找到正確的訓練權重,獲得最佳學習率,找到最佳超參數以及最適合你的數據和模型的架構。再加上沒有足夠的質量數據來訓練,以及它需要的計算強度會對我們的資源造成嚴重損失,這些因素在第一輪就把你擊倒。但不要害怕,因為 Fast.ai 等深度學習庫會充當我們強有力的助手,讓你立即重返賽場。
目錄
1. Fast.ai概述
2. 我們?yōu)槭裁匆褂?Fast.ai?
· 圖像數據包
· LR 查找
· fit_one_cycle
3. 案例研究:緊急與非緊急車輛分類
Fast.ai概述
Fast.ai 是建立在 PyTorch 之上的流行深度學習框架。它旨在通過幾行代碼快速輕松地構建最先進的模型。它極大地簡化了深度學習模型的訓練過程,而不會影響訓練模型的速度、靈活性和性能。Fast.ai 也支持計算機視覺和 NLP 中最先進的技術和模型。
我們?yōu)槭裁匆褂?Fast.ai?
除了 Fast.ai 模型的高生產力和易用性之外,它還確保了我們能夠自定義高級 API 而無需干預較低級的 API。Fast.ai 還包含一些非?岬墓δ埽蛊涑蔀槌鯇W者最喜歡的深度學習庫之一。
圖像數據包
圖像數據包有助于匯集我們的訓練、驗證和測試數據,并通過執(zhí)行所有必需的轉換和標準化圖像數據來處理數據。
LR 查找
學習率會影響我們的模型學習和適應問題的速度。低學習率會減慢訓練過程的收斂速度,而高學習率會導致性能出現令人不快的分歧。
因此,良好的學習率對于模型的令人滿意的性能至關重要,而找到最佳學習率就像大海撈針一樣。Fast.ai 的“l(fā)r_find()”是我們的騎士,它將我們從尋找合適學習率的痛苦中解救出來。
recorder.plot()
lr_find() 的工作原理是最初使用非常低的學習率來訓練小批量數據并計算損失。然后它以比前一個稍高的學習率訓練下一個小批量。這個過程一直持續(xù)到我們到達一個合適的學習率。我們可以使用 recorder.plot() 來獲取學習率與 Loss 的圖,這簡化了選擇良好的學習率的任務。選擇學習率的依據是哪個學習率為我們的損失提供了最陡的斜率,而不是哪個學習率的損失最低。
fit_one_cycle
fit_one_cycle 方法實現了循環(huán)學習率的概念。在這種方法中,我們使用在最小和最大界限值之間波動的學習率,而不是使用固定或指數下降的學習率。
循環(huán)學習率。訓練神經網絡的循環(huán)學習率 - https://arxiv.org/pdf/1506.01186.pdf
CLR 中的每個循環(huán)由 2 個步驟組成,其中學習率從最小值增加到最大值,下一步反之亦然。假設最佳學習率位于所選的最小值和最大值之間。這里,步長表示用于增加或減少每一步的學習率的迭代次數。
我們使用循環(huán)學習率,通過循環(huán)數來擬合我們的模型。學習率在訓練期間的每個循環(huán)中在所選的最小學習率到最大學習率之間振蕩。CLR 的使用消除了我們的訓練模型陷入鞍點的可能性。
fit_one_cycle 方法還實現了學習率 Annealing 的概念,我們在最后幾次迭代中使用減少的 LR。最后一次迭代的學習率通常取為所選最小學習率的百分之一。這可以防止在我們接近它時超出最優(yōu)值。
案例研究:緊急與非緊急車輛分類
讓我們嘗試使用 Fast.ai 在 Imagenets 數據集中使用預訓練的 Resnet50 模型解決緊急與非緊急車輛分類問題。
導入模塊
from fastai.vision import *
from fastai.vision.models import resnet50
使用 ImageDataBunch 進行數據增強
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)
模型訓練
t_cnn1 = cnn_learner(data, resnet50, pretrained=True, metrics=[accuracy])
t_cnn1.fit_one_cycle(5)
最初,讓我們使用fit_one_cycle 訓練我們的模型 5 個時期。這是為了了解模型的工作原理。
使用 fit_one_cycle() 進行模型訓練
在這里,驗證損失遠小于訓練損失。這表明我們的模型擬合不足,與我們需要的模型相去甚遠。
解凍圖層(unfreeze)
讓我們解凍預訓練模型的層。這樣做是為了讓我們的模型學習特定于我們數據集的特征。我們再次擬合我們的模型,看看模型現在是如何工作的。
t_cnn1.unfreeze()
t_cnn1.fit_one_cycle(8)
解凍圖層并訓練模型
學習率查找器
使用 lr_find 和 recorder.plot,我們將能夠清楚地了解哪種學習率最適合我們的模型。利用學習率與損失圖來選擇學習率。
t_cnn1.lr_find()
t_cnn1.recorder.plot()
針對損失圖的學習率
可以看到 1e-4 之后的損失逐漸增加。因此,將初始層的學習率選擇為 1e-5,將后面的層選擇為 1e-4 將是一個明智的想法。
我們再次擬合我們的方法并使用選擇的學習率對其進行訓練。該模型稍后會被凍結并導出以供以后使用。
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')
訓練和凍結模型
fit_one_cycle() 中的切片用于實現判別學習。它基本上告訴模型以 1e-5 的學習率訓練初始層,以 1e-4 的學習率訓練最終層,以及它們之間的層,其值介于這兩個學習率之間。
預測
完成所有模型訓練后,我們只剩下預測測試數據集的任務了。現在讓我們加載我們之前導出的測試數據和 Resnet50 模型,并使用它來預測我們的測試數據。
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].argmax(-1)
尾注
瞧!我們現在已經預測了我們的測試數據,而無需花費大量時間來建立一個更大的訓練數據集、設計和訓練我們的深度學習模型,也不會完全耗盡我們的計算資源。
原文標題 : 使用 Fast ai 進行圖像分類

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
7月8日立即報名>> 【在線會議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯
-
7月22-29日立即報名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會
-
7.30-8.1火熱報名中>> 全數會2025(第六屆)機器人及智能工廠展
-
7月31日免費預約>> OFweek 2025具身智能機器人產業(yè)技術創(chuàng)新應用論壇
-
免費參會立即報名>> 7月30日- 8月1日 2025全數會工業(yè)芯片與傳感儀表展
-
即日-2025.8.1立即下載>> 《2024智能制造產業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
推薦專題