深度學(xué)習(xí)框架Flash如何僅用幾行代碼構(gòu)建圖像分類器?
譯文【51CTO.com快譯】一、簡介
圖像分類是我們想要預(yù)測哪個類別屬于圖像的任務(wù)。由于圖像表示,這項任務(wù)很困難。如果我們將圖像鋪平,它會創(chuàng)建一個長長的一維向量。此外,該表示將丟失相鄰信息。因此,我們需要深度學(xué)習(xí)來提取特征并預(yù)測結(jié)果。
有時,構(gòu)建深度學(xué)習(xí)模型會成為一項艱巨的任務(wù)。雖然我們?yōu)閳D像分類創(chuàng)建了一個基礎(chǔ)模型,但需要花大量時間來創(chuàng)建代碼。我們必須準(zhǔn)備好用于準(zhǔn)備數(shù)據(jù)、訓(xùn)練模型并測試模型的代碼,并將模型部署到服務(wù)器上。這時Flash就有了用武之地!
Flash是一種高級深度學(xué)習(xí)框架,用于快速構(gòu)建、訓(xùn)練和測試深度學(xué)習(xí)模型。Flash基于PyTorch框架。所以如果您了解PyTorch,就會很熟悉Flash。
與PyTorch和Lighting相比,F(xiàn)lash易于使用,但不如以前的庫靈活。如果您想構(gòu)建更復(fù)雜的模型,可以使用Lightning或直接使用PyTorch。
借助Flash,您可以用幾行代碼構(gòu)建深度學(xué)習(xí)模型!因此,如果您剛接觸深度學(xué)習(xí),別害怕。Flash可以幫助您構(gòu)建深度學(xué)習(xí)模型,不會因代碼而感到困惑。
本文將介紹如何使用Flash構(gòu)建圖像分類器。
二、實施
安裝庫
想安裝庫,您可以使用pip命令,如下所示:
- pip install lightning-flash
如果該命令不起作用,可以使用其GitHub存儲庫安裝該庫。命令如下所示:
- pip install git+https://github.com/PyTorchLightning/lightning-flash.git
在我們可以成功下載軟件包之后,現(xiàn)在可以加載庫。我們還將種子設(shè)為編號42。這是執(zhí)行此操作的代碼:
- from pytorch_lightning import seed_everything
- import flash
- from flash.core.classification import Labels
- from flash.core.data.utils import download_data
- from flash.image import ImageClassificationData, ImageClassifier
- # set the random seeds.
- seed_everything(42)
- Global seed set to 42
- 42
下載數(shù)據(jù)
安裝完庫后,現(xiàn)在不妨獲取數(shù)據(jù)。出于演示需要,我們將使用名為Cat和Dog數(shù)據(jù)集的數(shù)據(jù)集。
該數(shù)據(jù)集含有兩個類別:貓和狗的圖像。想訪問數(shù)據(jù)集,您可以在Kaggle找到該數(shù)據(jù)集??梢栽?a >此處訪問數(shù)據(jù)集。
加載數(shù)據(jù)
下載數(shù)據(jù)后,不妨將數(shù)據(jù)集加載到一個對象中。我們將使用from_folders方法將數(shù)據(jù)放入到ImageClassification對象中。這是執(zhí)行此操作的代碼:
- datamodule = ImageClassificationData.from_folders(
- train_folder="cat_and_dog/training_set",
- val_folder="cat_and_dog/validation_set",
- )
加載模型
我們加載數(shù)據(jù)后,下一步就是加載模型。由于我們不會從頭開始構(gòu)建自己的架構(gòu),將使用基于現(xiàn)有卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)的預(yù)訓(xùn)練模型。
我們將使用已經(jīng)過預(yù)訓(xùn)練的ResNet-50模型。此外,我們基于數(shù)據(jù)集設(shè)置類別的數(shù)量。這是執(zhí)行此操作的代碼:
- model = ImageClassifier(backbone="resnet50", num_classes=datamodule.num_classes)
訓(xùn)練模型
加載模型后,現(xiàn)在不妨訓(xùn)練模型。我們需要先初始化Trainer對象。我們將用3個輪次(epoch)訓(xùn)練模型。此外,我們啟用GPU以訓(xùn)練模型。這是執(zhí)行此操作的代碼:
- trainer = flash.Trainer(max_epochs=3, gpus=1)
- GPU available: True, used: True TPU available: False, using: 0 TPU cores
初始化對象后,不妨訓(xùn)練模型。為訓(xùn)練模型,我們可以使用一個名為finetune的函數(shù)。在函數(shù)里面,我們設(shè)置模型和數(shù)據(jù)。此外,我們將訓(xùn)練策略設(shè)置為freeze(凍結(jié)),這表明我們不想訓(xùn)練特征提取器。換句話說,我們只訓(xùn)練分類器部分。
這是執(zhí)行此操作的代碼:
- trainer.finetune(model, datamodule=datamodule, strategy="freeze")
- LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] | Name | Type | Params ---------------------------------------- 0 | metrics | ModuleDict | 0 1 | backbone | Sequential | 23.5 M 2 | head | Sequential | 4.1 K ---------------------------------------- 57.2 K Trainable params 23.5 M Non-trainable params 23.5 M Total params 94.049 Total estimated model params size (MB)
- Validation sanity check: 0it [00:00, ?it/s]
- Global seed set to 42
- Training: 0it [00:00, ?it/s]
- Validating: 0it [00:00, ?it/s]
- Validating: 0it [00:00, ?it/s]
- Validating: 0it [00:00, ?it/s]
這是評估結(jié)果:
從結(jié)果中可以看出,我們的模型其準(zhǔn)確率達到了約97%。不賴!現(xiàn)在不妨拿幾個新數(shù)據(jù)測試模型。
測試模型
我們將使用針對該模型沒有訓(xùn)練過的樣本數(shù)據(jù)。以下是我們將測試模型的樣本:
- import matplotlib.pyplot as plt
- from PIL import Image
- fig, ax = plt.subplots(1, 5, figsize=(40,8))
- for i in range(5):
- ax[i].imshow(Image.open(f'cat_and_dog/testing/{i+1}.jpg'))
- plt.show()
為了測試模型,我們可以使用flash庫中的predict方法。這是執(zhí)行此操作的代碼:
- model.serializer = Labels()
- predictions = model.predict(["cat_and_dog/testing/1.jpg",
- "cat_and_dog/testing/2.jpg",
- "cat_and_dog/testing/3.jpg",
- "cat_and_dog/testing/4.jpg",
- "cat_and_dog/testing/5.jpg"])
- print(predictions)
- ['dogs', 'dogs', 'cats', 'cats', 'dogs']
從上面的結(jié)果可以看出,模型預(yù)測了帶有正確標(biāo)簽的樣本。很好!不妨保存模型以備后用。
保存模型
我們已訓(xùn)練并測試了模型。不妨使用save_checkpoint方法保存模型。這是執(zhí)行此操作的代碼:
- trainer.save_checkpoint("cat_dog_classifier.pt")
如果您想針對其他代碼加載模型,可以使用load_from_checkpoint方法。這是執(zhí)行此操作的代碼:
- model = ImageClassifier.load_from_checkpoint("cat_dog_classifier.pt")
三、結(jié)語
做得好!您已學(xué)習(xí)了如何使用Flash構(gòu)建圖像分類器。正如文章開頭所說,它只需要幾行代碼!是不是很酷?
但愿本文可以幫助您根據(jù)自己的情況構(gòu)建自己的深度學(xué)習(xí)模型。如果您想實施一個更復(fù)雜的模型,但愿能開始學(xué)習(xí) PyTorch。
原文標(biāo)題:How to Build An Image Classifier in Few Lines of Code with Flash,作者:Irfan Alghani Khalid
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】