[英]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 有一些对这个问题非常有用的函数:
tf.strings.as_string
tf.strings.reduce_join
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.