python - Keras:指定始终保持某些特征的输入丢失层

标签 python pandas neural-network deep-learning keras

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

此外,我认为还有一些其他功能应该适用于所有时代。也就是说,我仍然希望 dropout 层可以提高模型性能——它只需要不丢弃某些特征,比如 t_0 处的 X:我需要一个只会丢弃某些特征的 dropout 层。

我搜索了执行此操作的示例,并阅读了 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

最佳答案

我能想到的仅将 dropout 应用于特定特征的最佳方法是简单地将不同层中的特征分开。

为此,我建议您简单地将输入分为基本特征和可删除特征:

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

关于python - Keras:指定始终保持某些特征的输入丢失层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46333603/

相关文章:

Python 3.5 - 在 Windows 下创建带子文件夹的文件夹

python - 解析存储在 pandas 数据框列中的推文

python - 填充轮廓 OpenCV 的外部

python - 删除 pandas 的双 for 循环

machine-learning - Keras:为什么观察到的批量大小与指定的批量大小不匹配?

python - 算术编码和解码算法 Python

python - 替换单个 DataFrame 列中的负值

python - 如何从 Keras.layers 实现 Merge

python - 将正态分布转换为 softmax

python - 通过比较更多列值(标题名称之间有空格)来删除行