我有一个具有多个(8)输出神经元的keras模型,这些神经元都通过softmax激活函数进行运算。但是,我的数据集由大约300.000个数据点组成,但其中的数据大部分被填充,其中仅第一个输出神经元为1,而所有其他输出神经元为0时,神经网络就可以获得很高的评分。当我将模型拟合到数据集时,我陷入了0.3的损失(使用均方误差时),最终出现了不良的神经网络,这在新数据上效果不佳。
我想加权每个神经元的误差,除了让网络得分高的误差。在python /伪代码中,这类似于以下内容,其中y_true
和y_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_true
和y_true
计算损失,因为它们的类型为{ {1}}。
我也不知道我应该返回什么。当我返回0.0作为测试时,我收到以下错误:
<class 'tensorflow.python.framework.ops.Tensor'>
答案 0 :(得分:3)
在fit
方法中,有一个class_weight
参数用于为每个类(输出神经元)赋予权重。
因此,请使用它。阅读documentation
class_weight::可选的词典,将类索引(整数)映射到权重(浮点)值,用于对损失函数加权(仅在训练过程中)。这可能有助于告诉模型“更多关注”来自代表性不足的类的样本。
您想要这样的字典:
weights = { 0: low_weight,
1: high_weight,
2: high_weight,
....
7: high_weight }