如何使用Keras構建殘差神經網絡?

2020-12-04 不靠譜的貓

什麼是殘差神經網絡?

原則上,神經網絡的層數越多,應獲得越好的結果。一個更深層的網絡可以學到任何淺層的東西,甚至可能更多。如果對於給定的數據集,網絡無法通過添加更多的層來學習更多東西,那麼它就可以學習這些其他層的恆等映射(identity mappings)。這樣,它可以保留先前層中的信息,並且不會比較淺的層更糟糕。

但是,實際上情況並非如此。越深的網絡越難優化。隨著我們向網絡中添加層,我們在訓練過程中的難度也會增加;用於查找正確參數的優化算法也會變得越來越困難。隨著我們添加更多層,網絡將獲得更好的結果(直到某個時候為止)。然後,隨著我們繼續添加額外的層,準確性開始下降。

殘差網絡試圖通過添加所謂的skip connections來解決此問題。如前所述,更深層的網絡至少應該能夠學習恆等映射(identity mappings)。skip connections是這樣做的:它們從網絡中的一個點到另一點添加恆等映射,然後讓網絡僅學習額外的()。如果網絡沒有其他可以學習的東西,那麼它僅將()設為0。事實證明,對於網絡來說,學習一個更接近於0的映射比學習恆等映射更容易。

具有skip connection的塊稱為殘差塊,而殘差神經網絡(ResNet)只是這些塊的連接。

Keras Functional API簡介

可能您已經熟悉了Sequential類,它可以讓一個人很容易地構建一個神經網絡,只要把層一個接一個地堆疊起來,就像這樣:

但是,這種構建神經網絡的方式不足以滿足我們的需求。使用Sequential類,我們無法添加skip connections。Keras的Model類可與Functional API一起使用,以創建用於構建更複雜的網絡體系結構的層。

構造後,keras.layers.Input返回張量對象。Keras中的層對象也可以像函數一樣使用,以張量對象作為參數來調用它。返回的對象是張量,然後可以將其作為輸入傳遞到另一層,依此類推。

舉個例子:

這種語法的真正用途是在使用所謂的「 Merge」層時,通過該層可以合併更多輸入張量。這些層中的一些例子是:Add,Subtract,Multiply,Average。我們在構建剩餘塊時需要的是Add。

使用的Add示例:

ResNet的Python實現

接下來,我們將實現一個ResNet和其普通(無skip connections)副本,以進行比較。

我們將在此處構建的ResNet具有以下結構:

形狀為(32,32,3)的輸入1個Conv2D層,64個filters2、5、5、2殘差塊的filters分別為64、128、256和512池大小= 4的AveragePooling2D層Flatten層10個輸出節點的Dense層它共有30個conv+dense層。所有的核大小都是3x3。我們在conv層之後使用ReLU激活和BatchNormalization。

我們首先創建一個輔助函數,將張量作為輸入並為其添加relu和批歸一化:

然後,我們創建一個用於構造殘差塊的函數。

create_res_net()函數將所有內容組合在一起。這是完整的代碼:

普通網絡以類似的方式構建,但它沒有skip connections,我們也不使用residual_block()幫助函數;一切都在create_plain_net()中完成。

plain network的Python代碼如下:

訓練CIFAR-10並查看結果

CIFAR-10是一個包含10個類別的32x32 rgb圖像的機器學習數據集。它包含了50k的訓練圖像和10k的測試圖像。

以下是來自每個類別的10張隨機圖片樣本:

我們將在這個機器學習數據集上對ResNet和PlainNet進行20個epoch的訓練,然後比較結果。

ResNet和PlainNet在訓練時間上沒有顯著差異。我們得到的結果如下所示。

因此,通過在該機器學習數據集上使用ResNet ,我們將驗證準確性提高了1.59%。在更深層的網絡上,差異應該更大。

相關焦點

  • Keras入門系列教程:兩分鐘構建你的第一個神經網絡模型
    tf.keras使TensorFlow更易於使用而不犧牲靈活性和性能。構建一個簡單的模型順序模型在Keras中,您可以組裝網絡層來構建模型。模型通常是一個網絡層構成的圖。構建一個簡單的全連接的網絡(即多層感知器):model = keras.models.Sequential()# 添加一個含有64個神經網絡單元的全連接層到模型中,並且指定輸入數據的維度model.add(keras.layers.Dense(64, activation
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡
    來源:DeepHub IMBA本文約3600字,建議閱讀5分鐘本文為你介紹了如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)。如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)在生活中的某個時刻我們會發現,在Tensorflow Keras中預先定義的層已經不夠了!我們想要更多的層!我們想要建立一個具有創造性結構的自定義神經網絡!幸運的是,通過定義自定義層和模型,我們可以在Keras中輕鬆地執行此任務。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。
  • 深度學習故障診斷方法:殘差收縮網絡
    殘差收縮網絡是應用在機械故障診斷領域的一種深度學習方法,其實是殘差網絡、注意力機制和軟閾值化的結合。
  • 使用神經網絡為圖像生成標題
    我們都知道,神經網絡可以在執行某些任務時複製人腦的功能。神經網絡在計算機視覺和自然語言生成方面的應用已經非常引人注目。本文將介紹神經網絡的一個這樣的應用,並讓讀者了解如何使用CNNs和RNNs (LSTM)的混合網絡實際為圖像生成標題(描述)。
  • 用TensorFlow和Keras構建卷積神經網絡
    全文共9940字,預計學習時長20分鐘或更長不同神經網絡結構各有所長。本文主要介紹如何在Python中使用TensorFlow和Keras構建卷積神經網絡。卷積神經網絡是過去十年中深度學習成為一大熱點的部分原因。今天將使用TensorFlow的eager API來訓練圖像分類器,以辨別圖像內容是狗還是貓。人工神經網絡在許多領域都展現出了其強大功能,最近已經應用到很多行業中。
  • Keras結合Keras後端搭建個性化神經網絡模型(不用原生Tensorflow)
    它幫我們實現了一系列經典的神經網絡層(全連接層、卷積層、循環層等),以及簡潔的迭代模型的接口,讓我們能在模型層面寫代碼,從而不用仔細考慮模型各層張量之間的數據流動。但是,當我們有了全新的想法,想要個性化模型層的實現,Keras的高級API是不能滿足這一要求的,而換成Tensorflow又要重新寫很多輪子,這時,Keras的後端就派上用場了。
  • Keras官方中文版文檔正式發布了
    但該項目還在進行中,雖然目前已經上線了很多 API 文檔和使用教程,但仍然有一部分內容沒有完成。其實早在官方中文文檔出現以前,就有開發者構建了 Keras 的中文文檔,而且很多讀者都在使用 MoyanZitto 等人構建的中文文檔。
  • 教程| 如何使用TensorFlow構建、訓練和改進循環神經網絡
    目前有很多人工智慧應用都依賴於循環深度神經網絡,在谷歌(語音搜索)、百度(DeepSpeech)和亞馬遜的產品中都能看到RNN的身影。然而,當我們開始著手構建自己的 RNN 模型時,我們發現在使用神經網絡處理語音識別這樣的任務上,幾乎沒有簡單直接的先例可以遵循。
  • 教程 | 如何使用TensorFlow構建、訓練和改進循環神經網絡
    目前有很多人工智慧應用都依賴於循環深度神經網絡,在谷歌(語音搜索)、百度(DeepSpeech)和亞馬遜的產品中都能看到RNN的身影。然而,當我們開始著手構建自己的 RNN 模型時,我們發現在使用神經網絡處理語音識別這樣的任務上,幾乎沒有簡單直接的先例可以遵循。
  • 深入探討:殘差網絡解決了什麼,為什麼有效?
    現代神經網絡一般是通過基於梯度的BP算法來優化,對前饋神經網絡而言,一般需要前向傳播輸入信號,然後反向傳播誤差並使用梯度方法更新參數。實驗表明,殘差網絡很好地解決了深度神經網絡的退化問題,並在ImageNet和CIFAR-10等圖像任務上取得了非常好的結果,同等層數的前提下殘差網絡也收斂得更快[1]。這使得前饋神經網絡可以採用更深的設計。
  • 靈魂拷問:殘差網絡解決了什麼,為什麼有效?
    直觀上看,更深的神經網絡,在非線性激活函數的加持下,擁有更大的假設空間,因此當然「更有可能」包含了一個最優解。但是在實際使用時,訓練又成了一個難題。除了過擬合問題以外,更深的神經網絡會遇到如下兩個難題,我姑且按照物理史的比喻將其稱為深度神經網絡的「兩朵烏雲」:1.1 梯度彌散/爆炸現代神經網絡一般是通過基於梯度的BP算法來優化,對前饋神經網絡而言,一般需要前向傳播輸入信號,然後反向傳播誤差並使用梯度方法更新參數。第
  • 通過Keras 構建基於 LSTM 模型的故事生成器
    LSTM 網絡工作示意圖什麼是 LSTM 網絡?LSTM (Long Short Term Memory, 長短期神經網絡)是一種特殊的循環神經網絡(RNN, Recurrent neural networks)。
  • Keras和TensorFlow究竟哪個會更好?
    他給出的建議是先使用 Keras ,然後下載 TensorFlow 以獲取可能需要的任何特定功能。文本中,Rosebrock 展示了如何訓練使用 Keras 的神經網絡和使用直接構建在 TensorFlow 庫中的 Keras+TensorFlow 集成(具有自定義功能)的模型。
  • 初學者怎樣使用Keras進行遷移學習
    訓練數據必須以特定格式存儲,以便饋送到網絡中進行訓練。我們將使用Keras中提供的ImageDataGenerator來訓練我們的可用數據模型。這樣,就代碼而言,該過程變得更加簡單。 必須有一個主數據文件夾,在該數據文件夾中,每個包含相應圖像的數據類必須有一個文件夾。文件夾的名稱必須是其各自類的名稱。
  • 何凱明的深度殘差網絡PPT是這樣的|ICML2016 tutorial
    殘差網絡(ResNets)將如何解決這些問題?殘差網絡在模型表徵方面不存在直接的優勢(只是實現重複參數化)但是,殘差網絡允許逐層深入地表徵所有的模型殘差網絡使得前饋式/反向傳播算法非常順利進行在極大程度上,殘差網絡使得優化較深層模型更為簡單殘差網絡未直接處理學習深度模型過程中存在的歸納問題但是,更深+更薄是一種好的歸納手段另外,對於殘差網絡的詳細介紹可見何凱明博士在
  • 小白學CNN以及Keras的速成
    二、開始學習CNN在理解CNN之前,我們有必要先理解一下什麼是神經網絡,這樣才能開始了解更高級的卷積神經網絡。要學習神經網絡當然有很多途徑,網上不少的大牛寫了很多攻略,有的推崇從理論到工程完成深度學習,有的希望從工程出發發現問題,解決問題。
  • 了解1D和3D卷積神經網絡|Keras
    當我們說卷積神經網絡(CNN)時,通常是指用於圖像分類的2維CNN。但是,現實世界中還使用了其他兩種類型的卷積神經網絡,即1維CNN和3維CNN。在本指南中,我們將介紹1D和3D CNN及其在現實世界中的應用。我假設你已經大體上熟悉卷積網絡的概念。
  • 代碼詳解:一文掌握神經網絡超參數調優
    該景觀類似於神經網絡的損失平面。訓練神經網絡的目的是通過某種形式的優化找到損失平面上的最小值——典型的隨機坡度減少。在學習使用高難度的優化功能後,本文讀者能充分應對施行神經網絡時遇到的實際問題場景。測試神經網絡前,首先需要給功能下定義能並找出最小值(否則無法確定為正確答案)。
  • 人工智慧算法:訓練神經網絡中的批量歸一化(附代碼)
    而且,如果您還沒有這樣做的話,本文將解釋BN的基本直覺,包括其起源以及如何使用TensorFlow和Keras在神經網絡中實現它。對於那些熟悉BN技術並且只想專注於實現的人,可以跳到下面的「代碼」部分。