在本文中,我們將討論如何使用Keras在不適合內存的大數據集上訓練我們的深度學習網絡。
介紹
深度學習算法優於所有其他算法,能夠在大多數問題上產生最先進的結果。深度學習算法成功的主要原因是數據集的大小越來越大。現在,深度學習算法在大型數據集上進行訓練,這些數據集甚至不適合內存。問題是:如何在如此龐大的數據集上訓練我們的模型?本文分為以下幾個部分:
一般情況下,深度學習算法的性能優於其他算法,並且能夠在大多數問題上產生較好的結果。深度學習算法成功的主要原因是數據集的不斷增大。現在,深度學習算法在大型數據集上進行訓練,這些數據集甚至不適合內存。問題是:如何在如此巨的數據集中訓練我們的深度學習模型呢?本文分為以下幾個部分:
下載和了解數據集數據集的準備 - 批量加載數據集數據集在訓練和驗證集中的Shuffling和拆分創建自定義生成器定義模型體系結構和訓練模型結論作為一個例子,我們將解決Kaggle「Plant Seedlings Classification」的挑戰。這個數據集並不大,但我們將假設數據集太大,無法裝入內存,然後將批量加載數據集。
下載和了解數據集
您可以從此處下載數據集。解壓縮train.zip文件夾。該數據集包含分類為12種植物物種的不同階段的植物幼苗的4750幅圖像。12種植物有Black-grass,Charlock,Cleavers,Common Chickweed,Common wheat,Fat Hen,Losse Silky-bent,Maize,Scentless Mayweed,Shepherds Purse,Small-flowered Cranesbill,Sugar beet。競賽的目標是創建一個能夠從照片中確定植物種類的分類器。
當前目錄如下所示:
如果您的問題數據集不是這種格式,請不要擔心。您的數據集可以是任何格式。我們將在下一節中看到,目標是獲取所有數據點(即我們示例中的圖像)並將它們保存到單個文件夾中。數據點可以是圖像,音頻等。
數據集的準備 - 批量加載數據集
下一步是獲取整個數據集(即所有數據點(在我們的示例中為圖像))並將它們存儲到一個文件夾中。我們創建一個名為「all_images」的新文件夾,目標是將數據集中的所有圖像存儲在這個「all_images」文件夾中。
我們使用以下腳本將所有圖像存儲在「all_images」文件夾中。您可以編寫類似的腳本來獲取數據集中的所有數據點(可以是圖像,音頻等)並將它們存儲到新文件夾中。
下一步是將每個數據點的名稱(即每個圖像的名稱)存儲在一個數組中(讓我們將數組命名為filename)。還有一件事是將與每個數據點關聯的標籤存儲在另一個數組中(讓我們將這個數組稱為labels)。
下面是一個Python腳本,它將每個圖像的名稱存儲在filenames數組中,並將與該圖像關聯的標籤存儲在labels數組中。
注意:請記住,每個數據點的名稱應該是唯一的。
現在,您可以保存「all_images」文件夾、「filename」數組和「labels」數組,以便稍後使用。
下面我們創建一個由filename 和labels組成的numpy數組,並將它們保存為.npy文件。
數據集的shuffling和拆分
下一步是對數據集進行shuffle ,以便從數據集中刪除對稱性。
現在,讓我們將數據集拆分為訓練和驗證集。我們也可以保存這些文件,因為這些文件稍後將用於訓練和驗證我們的機器學習模型。
您還可以將「all_images」文件夾保存為zip格式,以便與其他團隊成員共享數據集。
這些代碼行只創建一個「all_images.zip」文件夾。
創建自定義生成器
注意:由於我們的數據集太大而無法容納在內存中,因此我們必須將數據集從硬碟批量加載到內存中。
為此,我們將創建一個自定義生成器。我們的自定義生成器將要將數據集從硬碟批量加載到內存中。
讓我們試著理解整個代碼:
第1行:我們的Custom Generator類繼承自Sequence類。
第3行:在這裡,我們可以向生成器提供參數。
第9行:此函數計算此生成器應該生成的批數。因此,我們將總樣本數除以batch_size並返回該值。
第14行:在這裡,給定批號idx,您需要將包含數據批次和ground-truth(GT)的列表放在一起。在此示例中,我們讀取大小為batch_size的批量圖像,並返回一個數組[image_batch, GT]。
在__getitem __(self,idx)函數中,您可以決定批量加載時數據集會發生什麼。在這裡,您也可以執行預處理步驟。此外,您還可以計算音頻文件的mel譜圖。
我們已經創建了數據生成器。下一步是創建此類的實例。
第3,4行:實例化My_Custom_Generator的兩個實例(一個用於訓練,一個用於驗證)。
定義模型體系結構和訓練模型
我們先導入一些Python庫:
現在,讓我們定義模型架構並編譯機器學習模型。您可以在此處使用任何模型架構。
現在,讓我們訓練我們的機器學習模型。
訓練結果:
我們的模型沒有給出很好的結果,而且過度擬合。我們可以使用不同的模型架構,或者預處理我們的數據集,或使用數據增強,或者使用遷移學習來提高精度。但是,這不是本文的目的。我希望現在您已經非常清楚地理解了如何使用大數據集來訓練一個深度學習模型。
結論
這篇文章,我試著用一個例子給你一個非常清晰的理解,告訴你如何用一個巨大的數據集訓練你自己的深度學習模型。
注意:最好先對數據集進行預處理,然後將其提供給學習算法。