如何在Keras中訓練大型數據集

2021-01-08 不靠譜的貓

在本文中,我們將討論如何使用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庫:

現在,讓我們定義模型架構並編譯機器學習模型。您可以在此處使用任何模型架構。

現在,讓我們訓練我們的機器學習模型。

訓練結果:

我們的模型沒有給出很好的結果,而且過度擬合。我們可以使用不同的模型架構,或者預處理我們的數據集,或使用數據增強,或者使用遷移學習來提高精度。但是,這不是本文的目的。我希望現在您已經非常清楚地理解了如何使用大數據集來訓練一個深度學習模型。

結論

這篇文章,我試著用一個例子給你一個非常清晰的理解,告訴你如何用一個巨大的數據集訓練你自己的深度學習模型。

注意:最好先對數據集進行預處理,然後將其提供給學習算法。

相關焦點

  • TensorFlow(Keras)中的正則化技術及其實現(附代碼)
    缺點是神經網絡更容易過度擬合訓練數據集。過度擬合:此問題涉及算法過於精確地預測在訓練過程中觀察和學習到的模式實例,從而預測向其呈現的模式的新實例。這可能導致機器學習算法無法準確地推廣到看不見的數據。如果訓練數據不能準確表示測試數據的分布,則可能會發生過度擬合。
  • 初學者怎樣使用Keras進行遷移學習
    訓練數據必須以特定格式存儲,以便饋送到網絡中進行訓練。我們將使用Keras中提供的ImageDataGenerator來訓練我們的可用數據模型。這樣,就代碼而言,該過程變得更加簡單。 必須有一個主數據文件夾,在該數據文件夾中,每個包含相應圖像的數據類必須有一個文件夾。文件夾的名稱必須是其各自類的名稱。
  • Keras和TensorFlow究竟哪個會更好?
    我會使用基於 TensorFlow 的標準 keras 模塊和 tf.keras 模塊,來實現一個卷積神經網絡(CNN)。然後,基於一個示例數據集,來訓練這些 CNN,然後檢查所得結果,你會發現,Keras 和 TensorFlow 是可以和諧共處的。
  • 人工智慧算法:訓練神經網絡中的批量歸一化(附代碼)
    而且,如果您還沒有這樣做的話,本文將解釋BN的基本直覺,包括其起源以及如何使用TensorFlow和Keras在神經網絡中實現它。對於那些熟悉BN技術並且只想專注於實現的人,可以跳到下面的「代碼」部分。
  • 評測| CNTK在Keras上表現如何?能實現比TensorFlow更好的深度學習嗎?
    下面是不同數據集的結果。IMDb 評論數據集IMDb 評論數據集(http://ai.stanford.edu/~amaas/data/sentiment/)是用於情感分析的著名的自然語言處理(NLP)基準數據集。數據集中的 25000 條評論被標記為「積極」或「消極」。在深度學習成為主流之前,優秀的機器學習模型在測試集上達到大約 88% 的分類準確率。
  • 圖片數據集太少?看我七十二變,Keras Image Data Augmentation 各...
    圖像深度學習任務中,面對小數據集,我們往往需要利用Image Data Augmentation圖像增廣技術來擴充我們的數據集,而keras的內置ImageDataGenerator很好地幫我們實現圖像增廣。但是面對ImageDataGenerator中眾多的參數,每個參數所得到的效果分別是怎樣的呢?
  • 如何在Keras中創建自定義損失函數?
    Dhruv Deshmukh 發布在 Unsplash 上的照片我們使用損失函數來計算一個給定的算法與它所訓練的數據的匹配程度。損失計算是基於預測值和實際值之間的差異來做的。如果預測值與實際值相差甚遠,損失函數將得到一個非常大的數值。
  • 圖像分類入門,輕鬆拿下90%準確率|教你用Keras搞Fashion-MNIST
    原作 Margaret Maynard-Reid王小新 編譯自 TensorFlow的Medium量子位 出品 | 公眾號 QbitAI這篇教程會介紹如何用TensorFlow裡的tf.keras函數,對Fashion-MNIST數據集進行圖像分類。
  • 手把手教程:如何從零開始訓練 TF 模型並在安卓系統上運行
    1.訓練自定義分類器加載數據我們將使用作為tf.keras框架一部分的mnst數據。       optimizer=keras.optimizers.Adam(),        metrics=['accuracy']) return model訓練模型 然後我們使用 model.fit(
  • 5分鐘入門GANS:原理解釋和keras代碼實現
    本篇文章包含以下內容介紹歷史直觀解釋訓練過程GAN在MNIST數據集上的KERAS實現鑑別器網絡的目的是獲取這個輸入,並預測這個圖像是來自真實的數據集還是合成的。正如我們剛才看到的,這實際上就是GANs,兩個相互競爭的敵對網絡。GAN的訓練過程GANS的訓練是出了名的困難。在CNN中,我們使用梯度下降來改變權重以減少損失。
  • 使用Keras將音樂分類為不同類型
    在本文中,我們將使用機器學習把音樂片段分類為不同類型。  我們將使用GTZAN genre collection數據集。   我們將根據我們的要求處理機器學習數據集。  我們使用librosa包計算了所有功能,並創建了一個帶有data.csv文件名的數據集,並在給定的標題中插入了給定音樂的所有特徵值。
  • MXNet 宣布支持 Keras 2,可更加方便快捷地實現 CNN 及 RNN 分布式...
    開發者可以在 Keras 中進行設計,使用 Keras-MXNet 進行訓練,並且在生產中用 MXNet 進行大規模推算。用 Keras 2 和 MXNet 做分布式訓練本文介紹如何安裝 Keras-MXNet 並演示如何訓練 CNN 和 RNN。如果您之前嘗試過使用其他深度學習引擎做分布式訓練,那麼您應該知道這過程可能很乏味而且很困難。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    在本文中,我們將了解如何在PyTorch和TensorFlow中建立基本的圖像分類模型。我們將從PyTorch和TensorFlow的簡要概述開始。然後,我們將使用MNIST手寫數字分類數據集,並在PyTorch和TensorFlow中使用CNN(卷積神經網絡)建立圖像分類模型。這將是你的起點,然後你可以選擇自己喜歡的任何框架,也可以開始構建其他計算機視覺模型。
  • Keras R語言接口正式發布,同時公開20個完整示例
    關於keras的介紹Keras是一個高層神經網絡API,為支持快速實驗而生,目前主要功能如下:支持相同的代碼無縫跑在CPU或GPU上對用戶友好,易於快速prototype深度學習模型支持計算機視覺中的卷積網絡、序列處理中的循環網絡,也支持兩種網絡的任意組合支持任意網絡架構:多段輸入或多段輸出模型、層共享、模型共享等。
  • 用TensorFlow和Keras構建卷積神經網絡
    本文主要介紹如何在Python中使用TensorFlow和Keras構建卷積神經網絡。 卷積神經網絡是過去十年中深度學習成為一大熱點的部分原因。今天將使用TensorFlow的eager API來訓練圖像分類器,以辨別圖像內容是狗還是貓。人工神經網絡在許多領域都展現出了其強大功能,最近已經應用到很多行業中。
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡
    來源:DeepHub IMBA本文約3600字,建議閱讀5分鐘本文為你介紹了如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)。如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)在生活中的某個時刻我們會發現,在Tensorflow Keras中預先定義的層已經不夠了!我們想要更多的層!我們想要建立一個具有創造性結構的自定義神經網絡!幸運的是,通過定義自定義層和模型,我們可以在Keras中輕鬆地執行此任務。
  • 從小白到入門:用Keras進行圖像基礎分類
    【IT168 資訊】在這篇文章中,將解釋一些在keras中經常需要的常見操作。首先,如何保存模型並使用它們進行預測,從數據集中顯示圖像並從加載系統中圖像並預測其類別。
  • Keras結合Keras後端搭建個性化神經網絡模型(不用原生Tensorflow)
    而我們創新主要在於前兩個,因此下面介紹如何結合Keras高級API與後端,自定義特殊神經網絡層以及損失函數。自定義網絡層自定義層可以通過兩種方式實現:使用Lambda層和繼承Layer類。lambda層Lambda層僅能對輸入做固定的變換,並不能定義可以通過反向傳播訓練的參數(通過Keras的fit訓練),因此能實現的東西較少。
  • Keras 之父講解 Keras:幾行代碼就能在分布式環境訓練模型 |...
    但現在,我們把 Keras API 直接整合入 TensorFlow 項目中,這樣能與你的已有工作流無縫結合。至此,Keras 成為了 TensorFlow 內部的一個新模塊:tf.keras,它包含完整的 Keras API。「對於 TensorFlow 用戶,這意味著你獲得了一整套易於使用的深度學習組件,並能與你的工作流無縫整合。
  • 如何使用Keras構建殘差神經網絡?
    如果對於給定的數據集,網絡無法通過添加更多的層來學習更多東西,那麼它就可以學習這些其他層的恆等映射(identity mappings)。這樣,它可以保留先前層中的信息,並且不會比較淺的層更糟糕。但是,實際上情況並非如此。越深的網絡越難優化。隨著我們向網絡中添加層,我們在訓練過程中的難度也會增加;用於查找正確參數的優化算法也會變得越來越困難。