聽它爹說他孩兒 Keras 學習筆記 5 2

2021-08-19 14:15:54 字數 3548 閱讀 9792

減小網路尺寸

防止過度擬合最簡單的辦法是減小網路尺寸,即減少模型可學習引數的數目。決定模型引數多少的,是層的數目和每層單元的數目。模型的引數越多,儲存容量越大,表示訓練樣本及其目標影射關係的詞典效能越好。例如,具有 500,000 二值引數的模型,可以輕鬆學會 mnist 訓練集全部數字的分類。要永遠記住:深度學習模型可以很好地擬合訓練資料,但真正的挑戰是泛化,不是擬合。

同時也要記住,你的模型應當有足夠的儲存資源,以使用足夠的引數,防止欠缺擬合。網路的大小應該適中,不宜過大或過小、

不幸的是,無法簡單確定正確的網路層數和每層單元數。你必須評估不同架構的陣列,以找到適合你的資料的模型大小。評估要用你的驗證資料,不能用測試資料。通常的流程是這樣:起初用相對很少的網路層和引數,然後逐漸增大層的容量,或者增加新層,直到你看見驗證損失的逐漸降低。

原始模型 

from keras import models

from keras import layers

model = models.sequential()

model.add(layers.dense(16, activation='relu', input_shape=(10000,)))

model.add(layers.dense(16, activation='relu'))

model.add(layers.dense(1, activation='sigmoid'))

減少容量後的模型 

model = models.sequential()

model.add(layers.dense(4, activation='relu', input_shape=(10000,)))

model.add(layers.dense(4, activation='relu'))

model.add(layers.dense(1, activation='sigmoid'))

增加容量後的模型 

model = models.sequential()

model.add(layers.dense(512, activation='relu', input_shape=(10000,)))

model.add(layers.dense(512, activation='relu'))

model.add(layers.dense(1, activation='sigmoid'))

使用權重正則化技術你可能熟悉奧卡姆剃刀定律(occam's razor):對某一問題有兩種解釋,用的假設最少、最簡單的往往是正確的解釋。相同的理念也可用於神經網路的學習模型:給出網路架構和一些訓練資料、多組權重值(多個模型),可以解釋這些資料。簡單的模型比複雜的模型更少出現過度擬合。

這裡所說的簡單模型是這樣的:它的各引數值的分布熵較小,或者,如你前面見到的,它的引數較少。「熵」的物理意義是體系混亂程度的度量。減緩過度擬合的通常做法,是限制網路的複雜程度,強制它的權重取值範圍很小,權重分布更為規範。這就是權重正則化,在網路的損失函式中,對較大權重增加成本。這種成本出自兩種計算:

keras 權重正則化的實現,是把正則生成器的例項作為關鍵字引數,傳遞給各層。讓我們給影評分類網路增加 l2 正規化正則化。

給模型增加

l2 正規化正則化

from keras import regularizers

model = models.sequential()

model.add(layers.dense(16, kernel_regularizer=regularizers.l2(0.001),

activation='relu', input_shape=(10000,)))

model.add(layers.dense(16, kernel_regularizer=regularizers.l2(0.001),

activation='relu'))

model.add(layers.dense(1, activation='sigmoid'))

l2(0.001) 的含意是:網路層權重矩陣的每一係數增加 0.001與權重系數值的乘積,從而加大網路的總損失。注意,因為這一懲罰只在訓練時採用,網路訓練時的損失遠大於測試時的損失。

你還可以這樣使用 keras 的正則化生成器。

from keras import regularizers

regularizers.l1(0.001) # l1 正則生成器

regularizers.l1_l2(l1=0.001, l2=0.001) # l1 和 l2 同步的正則生成器

使用捨棄技術

捨棄,是神經網路正則化技術最有效、最常用的之一。捨棄技術用於網路層,把訓練過程中層輸出特徵的數字,隨機捨棄(設定為零)。假如訓練過程中,對於某個輸入,乙個層返回向量 [0.2, 0.5, 1.3, 0.8, 1.1] 。在應用捨棄技術後,向量中的幾個值隨機地變為零,例如 [0, 0.5, 1.3, 0, 1.1]。捨棄率是歸零的個數在全部特徵中的佔比,通常 0.2 至 0.5。在測試階段,並不捨棄特徵值,相反地,層的輸出值按捨棄率同等縮小,因此,測試時得到的特徵值比訓練時多。

設想有個 numpy 矩陣包含某層的輸出 layer_output,形狀是(批量大小,特徵值)。訓練時,我們把矩陣的一些值隨機歸零:

layer_output *= np.random.randint(0, high=2, size=layer_output.shape)# 訓練時,捨棄過 50% 的輸出
測試時,我們按捨棄率縮小輸出值。在此,縮小0.5(因為此前捨棄過這些輸出):

layer_output *= 0.5 # 測試時
注意,這種處理的實現,可在訓練時採取兩種操作,測試時保留輸出不變。這是實踐中經常用到的:

layer_output *= np.random.randint(0, high=2, size=layer_output.shape) # 訓練時

layer_output /= 0.5 # 注意,這裡是放大不是縮小

在 keras 中,你可以用 dropout 層把捨棄技術引入神經網路。 dropout 層用於捨棄前面層的輸出:

model.add(layers.dropout(0.5))
我們在 imdb 網路中增加兩個 dropout 層,看看它們降低過度擬合的效果。

model = models.sequential()

model.add(layers.dense(16, activation='relu', input_shape=(10000,)))

model.add(layers.dropout(0.5))

model.add(layers.dense(16, activation='relu'))

model.add(layers.dropout(0.5))

model.add(layers.dense(1, activation='sigmoid'))

概括起來,防止神經網路過度擬合的常用方法有:

聽它爹說他孩兒 Keras 學習筆記 3 4

如前所見,我們首個神經網路的各層這樣來轉化資料 output relu dot w,input b 在此,w 和 b 是張量,是層的屬性。它們被叫做層的權重或者可訓練的引數。權重 w 是核心屬性,b 是偏置屬性。權重包含的資訊,用於網路訓練資料的學習。起初,權重矩陣填充的是些微小的隨機數,叫做隨機初...

聽它爹說他孩兒 Keras 學習筆記 4 1

這是 deep learning with python 第 3 章的學習筆記。本章內容包括 你已經知道,神經網路的訓練涉及如下東西 層 深度學習的建築構件 層是神經網路的基本資料結構。層是資料處理模組,層的輸入和輸出是乙個或多個張量。有些層沒有狀態表示,但更多常見的層有個狀態表示 層的權重。權重包...

聽它爹說他孩兒 Keras 學習筆記 4 2

keras 擁有以下重要功能 keras 擁有超過 200,000 的使用者,其中大公司有 google,netflix,uber,cern,yelp,square 等。keras 也是 開搞 kaggle 的流行框架。用 keras 進行開發 keras 開發的流程是這樣的 定義訓練用的資料 輸入...