【问题标题】:how to work on numpy arrays during training for custom loss function在自定义损失函数的训练期间如何处理 numpy 数组
【发布时间】:2021-02-24 11:01:47
【问题描述】:

我目前正在研究一个用 tensorflow 和 keras 实现的神经网络,我需要做的是调用一个我无法重新实现的函数,它适用于 numpy 数组而不是张量,我的第一个想法是调用.nu​​mpy 像这样

def loss_gi(y_true, y_pred): # <class 'tensorflow.python.framework.ops.Tensor'>
  x = gamma(np.squeeze(y_true.numpy() , axis=0), np.squeeze(y_pred.numpy() , axis=0)) 
  return np.nansum(x)

with strategy.scope():
  model = hd_unet_model(INPUT_SIZE)
  model.compile(optimizer=Adam(lr=0.001), 
                loss=loss_gi)

伽马返回一个体积。
但是在Model.fit 期间,如果您尝试在张量上调用y.numpy,则会收到错误Tensor has no attribute numpy,这是因为.numpy 仅适用于急切执行而不适用于图形执行(至少这是我所理解的)。

有人知道如何创建适用于 numpy 数组的自定义损失函数吗?

【问题讨论】:

  • 你需要在 Eager 模式下工作才能实现。
  • 损失函数必须在 TF 中才能产生梯度。使用 Numpy 损失函数破坏了 TF 库作为具有梯度的张量的整个想法。 1)据我所知,您的 y_pred 和 y_true 来自 tf.Tensors。为什么不将纯 TF 用于自定义损失函数? 2)如果 y_trus 最初是在 numpy 中 - 你无论如何都会在函数内将它转换为 TF 。那么为什么不在运行模型之前将 y_true 转换为 TF。
  • @sooobus 是的,你是对的,但我没有这样做,我不知道我应该怎么做,我尝试使用 tf.numpy_fction 但我没有得到任何结果

标签: python numpy tensorflow keras


【解决方案1】:

损失函数必须在 TF 中,这样它才能产生梯度。使用 Numpy 损失函数破坏了 TF 库作为具有梯度的张量的整个想法。所以你的选择是:

  1. 为自定义损失函数使用纯 TF。

  2. 如果 y_true 最初在 numpy 中 - 在运行模型之前将 y_true 转换为 TF。

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2017-08-24
    • 2020-07-14
    • 1970-01-01
    • 2020-11-07
    • 2019-11-12
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多