【问题标题】:How to implement a weighted mean squared error function in Keras如何在 Keras 中实现加权均方误差函数
【发布时间】:2018-10-24 23:14:50
【问题描述】:

我在 Keras 中定义加权均方误差如下:

def weighted_mse(yTrue,yPred):
    data_weights = [w0,w1,w2,w3]
    data_weights_np = np.asarray(data_weights, np.float32)
    weights = tf.convert_to_tensor(data_weights_np, np.float32)
    return K.mean(weights*K.square(yTrue-yPred))

我有每个预测的权重列表。预测的形状例如:(25,4)。这是通过维度为 4 的最终密集层生成的。我希望在均方误差中对这些预测进行加权,因此我生成了一个张量并将其与误差平方和相乘。这是正确的方法吗? 因为,当我打印张量的形状时,将 tf.shape 用于 YTrue 和 YPred 它显示: Tensor("loss_19/dense_20_loss/Shape:0", shape=(3,), dtype=int32)

对于权重:

Tensor("loss_19/dense_20_loss/Shape_2:0", shape=(1,), dtype=int32)

【问题讨论】:

  • fit 方法的参数为 class_weightsample_weight

标签: python tensorflow keras


【解决方案1】:

Keras API 已经提供了一种机制来提供权重,例如model.fit 函数。来自documentation

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

sample_weight: 训练样本的可选 Numpy 权重数组,用于加权损失函数(仅在训练期间)。您可以传递一个与输入样本长度相同的平面 (1D) Numpy 数组(权重和样本之间的 1:1 映射),或者在时间数据的情况下,您可以传递一个具有形状的二维数组(样本、序列长度),对每个样本的每个时间步应用不同的权重。在这种情况下,您应该确保在 compile() 中指定 sample_weight_mode="temporal"。

如果你对每个样本都有一个权重,你可以将 NumPy 数组作为sample_weight 传递来达到同样的效果,而无需编写自己的损失函数。

【讨论】:

  • 抱歉,如果不清楚,我看起来像班级权重,但用于回归。我预测了 4 件事,我想对这 4 件事进行加权。不是样本。
猜你喜欢
  • 2017-11-23
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多