Keras:指定始终保留某些功能的输入丢失层

时间:2017-09-21 00:28:24

标签: python pandas neural-network deep-learning keras

我使用Python中的Keras训练神经网络用于时间序列气候数据(在时间t = T时预测值X),并尝试在输入上添加(20%)丢失层,这似乎是限制过度拟合并导致性能略有提高。然而,在我添加了一个新的且特别有用的特征(预测时t = 0时响应变量的值)之后,我发现通过去除丢失层大大提高了性能。这对我来说很有意义,因为我可以想象神经网络将如何学习"这一特征的重要性,并将其余的训练基于调整该值(即,"这些其他特征如何影响t = 0时的响应如何随时间变化t = T")。

此外,我认为还应该为所有时代提供一些其他功能。也就是说,我仍然希望丢失层可以改善模型性能 - 它只需要不丢弃某些特征,比如t_0处的X:我需要一个只会丢弃某些特征的丢失层。 /强>

我搜索了这样做的示例,并阅读了Keras文档here,但似乎无法找到方法。我可能会遗漏一些明显的东西,因为我还不熟悉如何手动编辑图层。任何帮助,将不胜感激。谢谢!

编辑:抱歉任何不清楚。这是我定义模型的代码(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

3 个答案:

答案 0 :(得分:2)

我认为仅将丢失应用于特定功能的最佳方法是简单地分离不同层中的功能。

为此,我建议您简单地将输入分为基本功能和可放置功能:

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, ...)

答案 1 :(得分:1)

这个问题已经被接受了,但在我看来,你是以糟糕的方式使用辍学。

Dropout仅适用于隐藏图层,不适用于输入图层!

辍学作为一个正规化者,并防止隐藏层复杂的共同适应,引用Hinton论文"我们的工作通过显示辍学可以有效地应用于隐藏层并且可以解释为一种模型平均的形式" (http://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf

辍学可被视为使用您的数据训练几个不同的模型,并在测试时对预测进行平均。如果你阻止你的模型在训练期间拥有所有输入,它将表现不佳,特别是如果一个输入是至关重要的。您想要的实际上是避免过度拟合,这意味着您在训练阶段(因此每个模型将首先选择最重要的特征)在测试之前防止过于复杂的模型。 通常的做法是放弃集成学习中的一些特征,但它是控制而不是像辍学那样随机。它也适用于神经网络,因为隐藏层(通常)有更多的神经元作为输入,因此丢失遵循大数定律,对于少量输入,你可以在一些不好的情况下几乎所有输入都丢失。

在结论中:在神经网络的输入层中使用dropout是一种不好的做法。

答案 2 :(得分:0)

在输入层中使用dropout不会造成任何危害。当然,用法/效果将与正常情况有所不同。效果类似于将合成噪声添加到输入信号。只有特征/像素/任何东西将是完全未知的[置零],而不是嘈杂的。将合成噪声插入输入是提高鲁棒性的最古老方法之一。只要您考虑一下它是否对您的数据集有意义,那肯定不是坏习惯。