Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义损失函数中的Keras动态样本权重计算_Python_Tensorflow_Keras_Deep Learning - Fatal编程技术网

Python 自定义损失函数中的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],我

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

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)