【发布时间】: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