簡體   English   中英

Keras:指定始終保留某些功能的輸入丟失層

[英]Keras: specify input dropout layer that always keeps certain features

我正在使用Python中的Keras訓練神經網絡用於時間序列氣候數據(在時間t = T時預測值X),並嘗試在輸入上添加(20%)丟失層,這似乎限制了過度擬合並導致性能略有提高。 然而,在我添加了一個新的且特別有用的特征(預測時t = 0時響應變量的值)之后,我發現通過去除丟失層大大提高了性能。 這對我來說很有意義,因為我可以想象神經網絡將如何“學習”這一特征的重要性,並將其余的訓練基於調整該值(即“這些其他特征如何影響響​​應如何”) = 0隨時間變化t = T“)。

此外,我認為還應該為所有時代提供一些其他功能。 也就是說,我仍然希望丟失層可以提高模型性能 - 它只需要不丟棄某些功能,比如t_0處的X: 我需要一個只會丟棄某些功能的丟失層。

我已經搜索了這樣做的例子,並在這里閱讀了Keras文檔,但似乎無法找到方法。 我可能會遺漏一些明顯的東西,因為我還不熟悉如何手動編輯圖層。 任何幫助,將不勝感激。 謝謝!

編輯:抱歉任何不清楚。 這是我定義模型的代碼(p是特征的數量):

def create_model(p):
   model = Sequential()
   model.add(Dropout(0.2, input_shape=(p,))) # % of features dropped
   model.add(Dense(1000, input_dim=p, kernel_initializer='normal'
                , activation='sigmoid'))
   model.add(Dense(30, kernel_initializer='normal', activation='relu'))
   model.add(Dense(1, kernel_initializer='normal',activation='linear'))
   model.compile(loss=cost_fn, optimizer='adam')
return model

我認為僅將丟失應用於特定功能的最佳方法是簡單地分離不同層中的功能。

為此,我建議您簡單地將輸入分為基本功能和可放置功能:

from keras.layers import *
from keras.models import Model

def create_model(essentialP,droppableP):
    essentialInput = Input((essentialP,))
    droppableInput = Input((droppableP,))

    dropped = Dropout(0.2)(droppableInput) # % of features dropped
    completeInput = Concatenate()([essentialInput,droppableInput])        

    output = Dense(1000, kernel_initializer='normal', activation='sigmoid')(completeInput)
    output = Dense(30, kernel_initializer='normal', activation='relu')(output)
    output = Dense(1, kernel_initializer='normal',activation='linear')(output)

    model = Model([essentialInput,droppableInput],output)
    model.compile(loss=cost_fn, optimizer='adam')

    return model

使用兩個輸入訓練模型。 您必須在培訓前管理您的輸入:

model.fit([essential_train_data,droppable_train_data], predictions, ...)

這個問題已經被接受了,但在我看來,你是以糟糕的方式使用輟學。

Dropout僅適用於隱藏層,不適用於輸入層!

輟學作為一個正規化者,並防止隱藏層復雜的共同適應,引用Hinton論文“我們的工作通過表明輟學可以有效地應用於隱藏層並且可以被解釋為模型平均的一種形式來擴展這個想法” ( http://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf

輟學可以看作是用你的數據訓練幾種不同的模型,並在測試時平均預測。 如果你阻止你的模型在訓練期間擁有所有輸入,它將表現不佳,特別是如果一個輸入是至關重要的。 您想要的實際上是避免過度擬合,這意味着您在訓練階段(因此每個模型將首先選擇最重要的特征)在測試之前防止過於復雜的模型。 通常的做法是放棄集成學習中的一些特征,但它是控制而不是像輟學那樣隨機。 它也適用於神經網絡,因為隱藏層(通常)有更多的神經元作為輸入,因此丟失遵循大數定律,對於少量輸入,你可以在一些不好的情況下幾乎所有輸入都丟失。

在結論中:在神經網絡的輸入層中使用dropout是一種不好的做法。

我沒有看到在輸入層使用dropout有任何損害。 當然,使用/效果會與正常情況略有不同。 效果類似於將合成噪聲添加到輸入信號; 只有特征/像素/任何完全未知的[歸零]而不是嘈雜。 將合成噪聲插入輸入是提高魯棒性的最古老方法之一; 只要你考慮一下它對你的數據集是否有意義,肯定是不錯的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM