fastai 官方教程之查看數據

本文為fastai官方教程編譯版本。若有錯誤,歡迎指正。

總目錄:

  • *查看數據:本節為初級教程,介紹怎樣快速的查看你的數據和模型預測結果。*
  • 推理學習器(Inference Learner):本節為中級教程,介紹怎樣為(模型)推理創建學習器。
  • 自定義類ItemList(Custom ItemList):本節為高級教程,介紹如何創建類ItemBase與類ItemList。
  • 使用極小的代價實現深度學習:本節介紹如何使用較少的GPU資源實現推理,和避免重啟筆記內核的時間。

查看數據

本文目錄:

  • 查看輸入與輸出
  • 視覺任務 分類問題 多標籤問題 迴歸任務示例 分割任務示例
  • 文本任務 語言模型 文本分類
  • 列表(Tabular)

查看輸入與輸出

在本節教程中,我們將介紹如何在一個API中查看視覺任務、文本任務或者列表應用中的模型輸入與輸出。我們將處理不同的任務,而且每次都在DataBunch中使用data block API來獲取數據、查看如何使用showbatch方法查看部分輸入、訓練合適地Learner後用showresults方法查看模型的實際輸出。

注意:照例,此頁面從Notebook生成,您可以在fasti git分支(https://github.com/fastai/fastai)中docs_src文件夾找到該筆記。這些示例旨在快速運行,所以我們使用部分示例數據集(且使用ResNet18作為主幹網絡,不進行長時間訓練)。您可以更改任一參數來進行自己的實驗!

視覺

為了快速訪問fastai內部的所有視覺函數,我們使用通用的 Import 語句:

<code>from fastai.vision import */<code>

分類問題讓我們使用MINIST手寫體數據集作為示例數據集:

<code>mnist = untar_data(URLs.MNIST_TINY)tfms = get_transforms(do_flip=False)/<code>

它是用imagenet結構建立的,因此我們使用它來加載我們的訓練和驗證數據集,然後對其進行標記、變換、將其轉換為ImageDataBunch,最終對其進行規範化。

<code>data = (ImageList.from_folder(mnist)        .split_by_folder()                  .label_from_folder()        .transform(tfms, size=32)        .databunch()        .normalize(imagenet_stats))/<code>

在DataBunch中正確設置好您的數據之後,我們可以調用函數 data.showbatch() 查看(可視化)數據。

<code>data.show_batch()/<code>
fastai 官方教程之查看數據

請注意,在顯示帶有標籤的圖像之前,圖像會自動進行歸一化處理(從文件夾名稱推斷)。如果默認值5太大,我們可以指定行數和限定圖形的大小。

<code>data.show_batch(rows=3, figsize=(4,4))/<code>
fastai 官方教程之查看數據

現在,讓我們創建一個 Learner 對象來訓練分類器。

<code>learn = cnn_learner(data, models.resnet18, metrics=accuracy)learn.fit_one_cycle(1,1e-2)learn.save('mini_train')/<code>
fastai 官方教程之查看數據

我們的模型迅速達到了91%左右的準確率,接下來讓我們看下模型在一組驗證樣本上的表現。我們使用 show_results 方法實現。

<code>learn.show_results()/<code>
fastai 官方教程之查看數據

由於驗證集通常是經過排序的,因此我們僅獲得了屬於同一類的圖像。然後,我們可以再次指定行數、圖形大小以及要進行預測的數據集進行查看。

<code>learn.show_results(ds_type=DatasetType.Train, rows=4, figsize=(8,10))/<code>
fastai 官方教程之查看數據

多標籤問題

現在讓我們使用planet數據集上進行演示,其(與其他數據集的)不同之處在於每個圖像可以具有多個標籤(而不僅僅是一個標籤)

<code>planet = untar_data(URLs.PLANET_TINY)planet_tfms = get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.)/<code>

這裡每張圖片的標籤都存儲在labels.csv文件中。我們需要在文件名中添加前綴'train'和後綴'.jpg',並設定每個標籤之間用空格分開。

<code>data = (ImageList.from_csv(planet, 'labels.csv', folder='train', suffix='.jpg')        .split_by_rand_pct()        .label_from_df(label_delim=' ')        .transform(planet_tfms, size=128)        .databunch()        .normalize(imagenet_stats))/<code>

我們可以通過函數data.show_batch來查看數據。

<code>data.show_batch(rows=2, figsize=(9,7))/<code>
fastai 官方教程之查看數據

然後我們可以相當輕鬆的創建Learner對象和進行嘗試性訓練。

<code>learn = cnn_learner(data, models.resnet18)learn.fit_one_cycle(5,1e-2)learn.save('mini_train')/<code>
fastai 官方教程之查看數據

要查看實際的預測結果,我們只需要運行方法learn.show_results()即可。

<code>learn.show_results(rows=3, figsize=(12,15))/<code>
fastai 官方教程之查看數據

迴歸問題對於接下來這個示例,我們使用BIWI頭部姿態(https://data.vision.ee.ethz.ch/cvl/gfanelli/headpose/headforest.html#db)數據集。在人物圖像中,我們要找出人臉的中心。在fastai文檔中,我們已經建立了一個包含有200張圖像數據的BIWI數據集子樣本集,同時將每個圖像中的中心座標對應文件名以字典的形式進行存儲。

<code>biwi = untar_data(URLs.BIWI_SAMPLE)fn2ctr = pickle.load(open(biwi/'centers.pkl', 'rb'))/<code>

為了獲取數據,我們使用這個字典去標記我們的項目。我們同樣使用PointsItemList使目標類型為ImagePoints(用於確保可以正確的應用數據增強)。當調用函數transform時我們確保設置tfm_y=True.

<code>data = (PointsItemList.from_folder(biwi)        .split_by_rand_pct(seed=42)        .label_from_func(lambda o:fn2ctr[o.name])        .transform(get_transforms(), tfm_y=True, size=(120,160))        .databunch()        .normalize(imagenet_stats))/<code>

接著,我們可以使用data.show_batch()可視化我們的數據.

<code>data.show_batch(row=3, figsize=(9,6))/<code>
fastai 官方教程之查看數據

我們在使用函數learn.show_results()之前先嚐試性訓練下我們的模型。

<code>learn = cnn_learner(data, models.resnet18, lin_ftrs=[100], ps=0.05)learn.fit_one_cycle(5, 5e-2)learn.save('mini_train')/<code>
fastai 官方教程之查看數據

<code>learn.show_results(rows=3)/<code>
fastai 官方教程之查看數據

分割示例本節我們將使用camvid數據集(至少是其中的一部分數據),我們需要預測數據圖像中的每一個像素點的類別。在“images”子文件夾中的每一幅圖像都相當於對應的圖像“labels”,也就是圖像的分割掩碼。

<code>camvid = untar_data(URLs.CAMVID_TINY)path_lbl = camvid/'labels'path_img = camvid/'images'/<code>

我們從'codes.txt'文件中讀取類別信息和每個圖像與其相關掩碼名稱的映射關係。

<code>codes = np.loadtxt(camvid/'codes.txt', dtype=str)get_y_fn = lambda x: path_lbl/f'{x.stem}_P{x.suffix}'/<code>

數據模塊API允許我們快速獲取 DataBunch中的任何內容,同時我們可以通過函數show_batch查看。

<code>data = (SegmentationItemList.from_folder(path_img)        .split_by_rand_pct()        .label_from_func(get_y_fn, classes=codes)        .transform(get_transforms(), tfm_y=True, size=128)        .databunch(bs=16, path=camvid)        .normalize(imagenet_stats))/<code>
<code>data.show_batch(rows=2, figsize=(7,5))/<code>
fastai 官方教程之查看數據

接下來,我們訓練Unet網絡幾個輪次(epochs)。

注意:本次訓練是相當不穩定的,使用更多地訓練輪次與更全的數據集可以獲得更好的結果。

<code>learn = unet_learner(data, models.resnet18)learn.fit_one_cycle(3,1e-2)learn.save('mini_train')/<code>

總耗時(00:23)

fastai 官方教程之查看數據

<code>learn.show_results()/<code>
fastai 官方教程之查看數據

文本

本節介紹在文本上的應用,同樣地讓我們從導入所有需要函數開始。

<code>from fastai.text import */<code>

語言模型首先我們在imdb子數據集上微調(fine-tune)一個預訓練模型。

<code>imdb = untar_data(URLs.IMDB_SAMPLE)/<code>
<code>data_lm = (TextList.from_csv(imdb, 'texts.csv', cols='text')                   .split_by_rand_pct()                   .label_for_lm()                   .databunch())data_lm.save()/<code>

函數data.show_batch()同樣也可以在這裡使用。對於語言模型來說,它向我們展示了沿著批處理維度每個文本序列的開頭(目標是猜下一個單詞)。

<code>data_lm.show_batch()/<code>
fastai 官方教程之查看數據

現在讓我們定義一個語言模型學習器。

fastai 官方教程之查看數據

總耗時(Total time):00:25

fastai 官方教程之查看數據

然後我們可以查看結果。它會顯示確定數量的單詞(默認20),以及之後的20個目標單詞和預測的單詞。

<code>learn.show_results()/<code>
fastai 官方教程之查看數據

文本分類本節介紹一個關於文本分類的例子。如果使用保存的編碼器,我們要使用與語言模型相同的詞彙表。

<code>data_clas = (TextList.from_csv(imdb, 'texts.csv', cols='text', vocab=data_lm.vocab)                   .split_from_df(col='is_valid')                   .label_from_df(cols='label')                   .databunch(bs=42))/<code> 

這裡通過函數 show_batch 顯示了每次評審(review)的開始(信息)以及其目標(target)。

<code>data_clas.show_batch()/<code>
fastai 官方教程之查看數據

然後我們可以使用之前的編碼器訓練一個分類器。

<code>learn = text_classifier_learner(data_clas, AWD_LSTM)learn.load_encoder('mini_train_encoder')learn.fit_one_cycle(2, slice(1e-3,1e-2))learn.save('mini_train_clas')/<code>

總耗時(Total time):00:25

fastai 官方教程之查看數據

<code>learn.show_results()/<code>
fastai 官方教程之查看數據

列表

本節介紹列表數據中的應用範例。首先讓我們導入全部所需要的函數。

<code>from fastai.tabular import */<code>

我們使用adult數據集(https://archive.ics.uci.edu/ml/datasets/adult)中的一部分數據。當我們讀取csv文件時,我們需要指定相關變量、類別變量、連續變量和要使用的處理器。

<code>adult = untar_data(URLs.ADULT_SAMPLE)df = pd.read_csv(adult/'adult.csv')dep_var = 'salary'cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'native-country']cont_names = ['education-num', 'hours-per-week', 'age', 'capital-loss', 'fnlwgt', 'capital-gain']procs = [FillMissing, Categorify, Normalize]/<code>

然後,我們可以使用數據塊API在使用data.show_batch()之前獲取所有內容。

<code>data = (TabularList.from_df(df, path=adult, cat_names=cat_names, cont_names=cont_names, procs=procs)                           .split_by_idx(valid_idx=range(800,1000))                           .label_from_df(cols=dep_var)                           .databunch())data.show_batch()/<code>


fastai 官方教程之查看數據

這裡我們可以得到嘗試性訓練後的tabular_learner。

<code>learn = tabular_learner(data, layers=[200,100], metrics=accuracy)learn.fit(5, 1e-2)learn.save('mini_train')/<code>

總耗時(Total time):00:19

fastai 官方教程之查看數據

我們可以使用learn.show_results()(查看結果)。

<code>learn.show_results()/<code>
fastai 官方教程之查看數據


分享到:


相關文章: