繁体   English   中英

自定义损失函数中的 Keras 实时样本权重计算

[英]Keras on-the-fly sample weights calculation in a custom loss function

我正在 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 error。 有没有办法将 dtype 转换为字符串、在字典中查找以及使用 keras 操作符号化地分配权重张量?

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

我正在使用:tensorflow 1.9.0 和 keras 2.2.4

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

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

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)

快乐编码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM