本文將一步步建立和訓練一個深度學習模型,以達到分類貓和狗的目的。閱讀者只要有一些高中數學基礎和python編程經驗就足夠了!
1.安裝程序
為了簡單起見,我們將在雲GPU(什麼是GPU)上運行模型。可以通過以下連結了解GPU在深度學習中的重要性:https://towardsdatascience.com/what-is-a-gpu-and-do-you-need-one-in-deep-learning-718b9597aa0d 。
有很多服務提供免費和付費的雲GPU實例。我們將使用Gradient,它提供免費的GPU和CPU實例層。我們也將使用fast.ai的vision庫來創建模型。
首先點擊這裡創建一個Gradient帳戶:https://console.paperspace.com/signup?gradient=true ;登錄你的帳戶並選擇「Gradient」;單擊「Notebook」;為實例命名(可選);選擇Paperspace + Fast.AI基本容器;
選擇任意一個免費的GPU實例;
單擊「Create Notebook」;
你的Notebook 將從掛起→設置→運行!
單擊「OPEN V1(CLASSIC)」按鈕;對於這個模型,我們將從Bing和DuckDuckGo上獲取圖像,它們將作為數據集。我們將安裝Joe Dockrill編寫的jmd_imagescraper庫,這將為我們完成任務。
單擊 New →Terminal。
鍵入並單擊enter:
!pip install -q jmd_imagescraper有關庫的更多信息,請訪問其官方頁面:https://joedockrill.github.io/blog/2020/09/18/jmd-imagescraper-library/
這把我們帶到了設置的最後。關閉終端,再次打開Notebook。編碼時間到了!
Jupyter Notebook
Jupyter Notebook是一個web應用程式,允許你創建包含實時代碼、公式和文本的文檔。你可以做任何事情,從編寫代碼到發布,以及使用Voilá構建獨立的web應用程式!我們將在Gradient提供的Jupyter Notebook上編寫和執行代碼。
Jupyter Notebook由許多單元組成,可以通過確定執行單元格的順序來控制工作流。
單擊New→Python3打開一個新的Notebook。
你可以編寫文本(在標記單元格中)或編寫python代碼(在代碼單元格中)並按如下方式執行:
使用Run和add cells選項分別執行代碼和添加更多單元格。
2.代碼
可以把每個代碼塊複製到不同的單元上,然後運行它們。
我們先導入fast.ai的vision庫和jmd_imagescraper。
!pip install -Uqq fastbookimport fastbook # 導入fast.ai庫from fastbook import * # 別擔心,它被設計成與import *一起工作fastbook.setup_book()from fastai.vision.widgets import *# 導入圖片爬取器, website: https://joedockrill.github.io/blog/2020/09/18/jmd-imagescraper-library/from jmd_imagescraper.core import * from pathlib import Pathfrom jmd_imagescraper.imagecleaner import *因為我們的目標是對貓和狗的圖像進行分類,所以可以建立一個名為「animals」的文件夾,我們可以下載並保存圖像。
最後一行將path變量設置為當前工作目錄中的「animals」文件夾。
animals=['cat','dog']path = Path().cwd()/"animals"# 指定當前工作目錄的路徑從jmd_imagescraper庫調用duckduckgo_search()函數,該函數接受以下內容作為輸入:
下載目錄(上面指定的路徑變量);文件夾名稱(cat);搜索DuckDuckGo(「貓」)的關鍵字;要下載的圖像數(100)。duckduckgo_search(path,"cat","cats",max_results=100) # 下載100張「貓」圖片並保存到path/cat中等到它搜索圖像,下載並直接保存到「animals」中名為「cat」的文件夾中。結果應該如下所示:
現在讓我們對狗的圖像做同樣的處理。
duckduckgo_search(path,"dog","dogs",max_results=100)# 下載100張「狗」圖片並保存到path/dog中通常會有一些不相關的圖像,這會妨礙訓練,所以我們刪除個別文件。Jupyter提供了一個刪除無關圖像的交互式GUI。
display_image_cleaner(path)
在文件夾之間切換並刪除不相關的圖像。我發現一些像這樣的圖片偷偷地進入了貓和狗的系列。
fns=get_image_files(path)fns查找失敗的下載並從文件夾中取消連結。
failed=verify_images(fns)# 尋找非圖像文件failedfailed.map(Path.unlink);# 從文件夾中取消失敗文件的連結現在讓我們創建一個Datablock對象,它將圖像發送到DataLoaders類。DataLoaders類將給定的數據轉換為學習者可以解釋的信息。
直覺上,學習者是一個觀察所有給定圖像並找到模式的人。如果遇到複雜的關鍵字,不要擔心,一旦你運行模型,一切都會變得有意義。
animals=DataBlock( blocks=(ImageBlock,CategoryBlock), get_items=get_image_files, splitter=RandomSplitter(valid_pct=0.2,seed=42),# 將數據集拆分為訓練集和驗證集 get_y=parent_label, item_tfms=RandomResizedCrop(224, min_scale=0.5), batch_tfms=aug_transforms())需要注意的是在第4行中,我們保留了20%的數據,以便在每個稱為epoch訓練結束時檢查模型。
創建一個名為dls的DataLoaders對象。
dls=animals.dataloaders(path)看看dls對象中單個批處理中的幾個圖像。
dls.valid.show_batch(max_n=4,nrows=1)
要求一個學習者在4個不同的訓練迭代或時期中根據輸入圖像進行學習。這需要一些時間,這取決於你的網絡速度。
learn = cnn_learner(dls, resnet18, metrics=error_rate)# 訓練我們的模型learn.fine_tune(4)
你可能不會看到與圖像中相同的結果,但是錯誤率應該小於0.05。
現在我們為驗證集繪製一個混淆矩陣。混淆矩陣告訴我們驗證集中有多少圖像被正確或錯誤地分類。
interp = ClassificationInterpretation.from_learner(learn)interp.plot_confusion_matrix()# 繪製混淆矩陣
混淆矩陣說明我們的分類器有多好。深藍色對角線上顯示的數字告訴我們正確預測圖像的數量。因此分類器做得很好!
我們將在下一行代碼中看到兩幅錯誤預測的圖片。
interp.plot_top_losses(5, nrows=1)
現在讓我們對模型進行真正的測試,好嗎?下載你選擇的貓或狗圖像並保存在本地。
learn.export()path = Path()path.ls(file_exts='.pkl')learn_inf = load_learner(path/'export.pkl')btn_upload = widgets.FileUpload()# 顯示可用於從系統上傳圖像的小部件btn_upload這將在你的Jupyter Notebook中創建一個小部件,如下所示:
點擊上傳並選擇你的圖片。
現在我們調整圖像大小,以便模型可以預測。最後一行顯示調整大小的圖像。
img = PILImage.create(btn_upload.data[-1])out_pl = widgets.Output()out_pl.clear_output()with out_pl: display(img.to_thumb(128,128))# 調整圖像的大小out_pl
下面的代碼預測圖像中的動物,並以我們可以理解的格式顯示它。
pred,pred_idx,probs = learn_inf.predict(img)# 要求模型預測圖像中的動物!lbl_pred = widgets.Label()lbl_pred.value = f'Prediction: {pred}; Probability: {probs[pred_idx]:.04f}'# 以可讀格式顯示輸出lbl_pred……………….
我們只用了大約200張圖片,就可以創建一個可以對貓和狗進行分類的模型。現在你可以繼續進行更改以創建分類器!