在keras模型中,我如何惩罚某些输出比其他输出更多?

时间:2019-12-26 21:02:26

标签: python tensorflow keras neural-network

我有一个具有多个(8)输出神经元的keras模型,这些神经元都通过softmax激活函数进行运算。但是,我的数据集由大约300.000个数据点组成,但其中的数据大部分被填充,其中仅第一个输出神经元为1,而所有其他输出神经元为0时,神经网络就可以获得很高的评分。当我将模型拟合到数据集时,我陷入了0.3的损失(使用均方误差时),最终出现了不良的神经网络,这在新数据上效果不佳。

我想加权每个神经元的误差,除了让网络得分高的误差。在python /伪代码中,这类似于以下内容,其中y_truey_pred可能是列表或numpy数组:

def some_error_function(...):
    # something like mean_squared_error()

def weighted_loss(y_true, y_pred):

    # Regular loss value for the first output neuron
    loss = some_error_function(y_true[0], y_pred[0])

    # Loss multiplied by 100 for the other output neurons
    loss += some_error_function(y_true[1:], y_pred[1:]) * 100

请澄清一下,some_error_function(...)可以将单个值用作参数或列表,因此y_pred[1:]意味着传递除第一个值以外的每个值的列表或numpy数组。

在编译模型时,如何用上面的加权损失函数替换当前的损失函数?

model.compile(optimizer=keras.optimizers.Adam(), loss=<current loss function>)

我尝试仅传递类似weighted_loss的函数,但是我不确定如何使用给定的y_truey_true计算损失,因为它们的类型为{ {1}}。

我也不知道我应该返回什么。当我返回0.0作为测试时,我收到以下错误:

<class 'tensorflow.python.framework.ops.Tensor'>

1 个答案:

答案 0 :(得分:3)

fit方法中,有一个class_weight参数用于为每个类(输出神经元)赋予权重。

因此,请使用它。阅读documentation

  

class_weight::可选的词典,将类索引(整数)映射到权重(浮点)值,用于对损失函数加权(仅在训练过程中)。这可能有助于告诉模型“更多关注”来自代表性不足的类的样本。

您想要这样的字典:

weights = { 0: low_weight, 
            1: high_weight, 
            2: high_weight,
            ....
            7: high_weight }