Python 自定义损失函数中的Keras动态样本权重计算
我在keras中实现了一种分割网络(带有tf后端),我想在其中为每个图像加权损失。权重将具有与目标图像相同的形状-即每个像素在损失中的权重将不同。据我所知,keras无法在本地实现这种加权方案。可以根据标签计算权重,由于数据集的大小,将权重存储在磁盘上是不可行的。因此,我已经开始编写自己的损耗函数,可以根据标签动态计算重量矩阵Python 自定义损失函数中的Keras动态样本权重计算,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我在keras中实现了一种分割网络(带有tf后端),我想在其中为每个图像加权损失。权重将具有与目标图像相同的形状-即每个像素在损失中的权重将不同。据我所知,keras无法在本地实现这种加权方案。可以根据标签计算权重,由于数据集的大小,将权重存储在磁盘上是不可行的。因此,我已经开始编写自己的损耗函数,可以根据标签动态计算重量矩阵 labels.shape==(?,5,101,101)。可以根据轴1从字典中查找权重。因此,对于批处理中的第一项,标签[0,:,0,0]的条目是[1,0,0,1,0],我
labels.shape==(?,5,101,101)
。可以根据轴1从字典中查找权重。因此,对于批处理中的第一项,标签[0,:,0,0]
的条目是[1,0,0,1,0]
,我会在字典中查找该值。如果标签是numpy数组,我可以执行以下操作:
labels.astype(object).sum(axis=1).astype(str)
这将为我提供一个形状数组(?,101,101)
,其中包含类似'10010'
的条目,我可以在字典中查找。我可以分配权重[0,:,0,0]=lookup['10010']
。最后,填充权重张量后,我可以得到我的损失:
keras.backend.categorical\u交叉熵(标签、预测)*keras.backend.constant(权重)
问题是我无法在自定义丢失函数中执行keras.backend.eval(labels)
来获取numpy数组。在编译模型时,图形是在没有任何数据输入的情况下构建的。此时使用eval
会导致InvalidArgumentError:必须为占位符张量
错误提供一个值。有没有一种方法可以将数据类型转换为字符串,在字典中查找,并使用keras操作象征性地分配权重张量
或者有没有一种方法可以解决这个问题,并在代码的其他地方计算权重?我正在使用keras.utils.Sequence
并在模型上调用fit_生成器
进行训练-还可以从数据生成器返回权重
我正在使用:
tensorflow 1.9.0和keras 2.2.4
我很高兴切换到更新版本的软件包。我将在这里回答我自己的问题,以防其他人也有同样的问题
tensorflow 2有一些函数对解决此问题非常有用:
用于将浮点矩阵转换为字符串-tf.strings.as\u string
用于跨维度连接字符串-tf.strings.reduce\u join
用于在名为weight\u 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)