【问题标题】:Keras on-the-fly sample weights calculation in a custom loss function自定义损失函数中的 Keras 即时样本权重计算
【发布时间】:2020-06-09 15:25:11
【问题描述】:

我正在 keras(带有 tf 后端)中实现一种分割网络,我想对每张图像的损失进行加权。权重将与目标图像具有相同的形状 - 即每个像素在损失中的权重不同。据我所知,keras 无法在本地实现这种加权方案。权重可以从标签中计算出来,并且由于数据集的大小,将权重存储在磁盘上是不可行的。因此,我已经开始编写自己的损失函数,可以根据标签即时计算权重矩阵。

labels.shape == (?, 5, 101, 101)。可以根据轴 1 从字典中查找权重。因此,对于批次中的第一项,labels[0, :, 0, 0] 的条目是[1, 0, 0, 1, 0],我会在字典中查找此值。如果标签是一个 numpy 数组,我可以执行以下操作:

labels.astype(object).sum(axis=1).astype(str)

这将给我一个形状数组(?, 101, 101),其中包含'10010' 之类的条目,我可以在字典lookup 中查找它们。我可以分配weights[0, :, 0, 0] = lookup['10010']。最后,填充了权重张量,我可以得到如下损失:

keras.backend.categorical_crossentropy(labels, predictions) * keras.backend.constant(weights).

问题是我无法通过keras.backend.eval(labels) 在我的自定义损失函数中获取 numpy 数组。在编译模型时,图是在不提供任何数据的情况下构建的。此时使用eval 会导致InvalidArgumentError: You must feed a value for placeholder tensor 错误。有没有办法将 dtype 转换为字符串、在字典中查找以及使用 keras 操作象征性地分配权重张量?

或者有没有办法解决这个问题并计算代码中其他地方的权重?我在模型上使用keras.utils.Sequence 并调用fit_generator 进行训练 - 也可以从数据生成器返回权重。

我正在使用: 张量流 1.9.0 和 keras 2.2.4

我很高兴切换到更新版本的软件包。

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    在这里回答我自己的问题,以防其他人有同样的问题

    tensorflow 2 有一些函数对这个问题非常有用:

    1. 用于将浮点矩阵转换为字符串 - tf.strings.as_string
    2. 用于跨维度连接字符串 - tf.strings.reduce_join
    3. 用于在名为weight_dict 的字典中查找张量的值
    tensor_of_interest = tensor after using tf.strings.as_string and tf.strings.reduce_join
    
    keys = tf.constant(list(weight_dict.keys()))
    values = tf.constant(list(weight_dict.values()))
    weight_table = tf.lookup.StaticHashTable(
       tf.lookup.KeyValueTensorInitializer(keys, values), -1
    )
    weights = weight_table.lookup(tensor_of_interest)
    

    愉快的编码

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2019-06-25
      • 2020-10-05
      • 2020-01-13
      • 2018-02-24
      • 2020-12-19
      • 2017-12-18
      • 2020-03-27
      • 1970-01-01
      相关资源
      最近更新 更多