繁体   English   中英

自定义损失的条件替换 Function 约束? TypeError: 'Tensor' object 不支持项目分配

[英]Conditional Replace for Custom Loss Function Constraint? TypeError: 'Tensor' object does not support item assignment

我有一个 model,它在一个批次中每个样本返回两个值,其中第一个值必须 >=0,第二个值必须 <=0。 我第一次尝试自定义错误 function 如下:

def maxMinDiffLossConstrained(y_true, y_pred, sample_weight=None):
 
    y_pred_shape = list(y_pred.shape) # y_pred returns a tuple, we want a list so we can construct another tensor 
    #y_pred_data = y_pred.numpy() # get the tensor data as a numpy array 
        
    y_pred[y_pred[:,0] < 0, 0] = -10            
    y_pred[y_pred[:,1] > 0, 1] = 10            
        
    y_mod = tf.reshape(y_pred, y_pred_shape)   
   
    mse = MeanSquaredError()
    loss = mse(y_true, y_mod)

    return loss

这是我得到错误的地方

TypeError: 'Tensor' object does not support item assignment

如您所见,我尝试使用y_pred.numpy()但 object 但type(y_pred)<class 'tensorflow.python.framework.ops.Tensor'>并返回错误:

AttributeError: 'Tensor' object has no attribute 'numpy'

我检查了许多其他帖子。 这个建议拆垛和重新堆叠

TypeError: 'Tensor' object 不支持 TensorFlow 中的项目分配

下一篇较长的文章很有帮助,它建议根据条件进行分解,然后重新制作张量。 我仍在努力使用这种方法找到解决方案:

https://towardsdatascience.com/how-to-replace-values-by-index-in-a-tensor-with-tensorflow-2-0-510994fe6c5f

不幸的是,由于我的张量的尺寸是(batch_size, 2)我还没有想出一个可行的解决方案。 我的困难是,在我使用以下代码获得 dim1 (>=0) 和 dim2 (<=0) 的真/假向量后:

maxes_to_remove = y_pred[:,0] < 0 
mins_to_remove = y_pred[:,1] > 0

idx_maxes = tf.where(maxes_to_remove == True)
idx_mins = tf.where(mins_to_remove == True)

我不确定如何仅替换需要替换的第一维中的值以及仅需要替换的第二维中的值。

作为旁注,我也遇到了这个问题,但能够解决它。

我相信 tf 中的张量是不可变的,因此您不能将值分配给数组中的索引。 两种解决方法:

  1. 定义使用原始张量和一些附加操作创建的新张量。 我建议使用tf.keras.backend.switch() ,它允许您根据张量从两个输入张量之一(对您来说将是 -10 的张量和 10 的张量)之一为新张量分配值boolean 值(对你来说这可能是 idx_maxes?)

  2. 转换为 numpy arrays,根据需要进行更改,然后转换回张量。 请注意,这仅在您处于急切执行模式时才有效。 如果您处于图形模式,直观地转换为 numpy 是不行的,因为 numpy arrays 不支持图形计算,因此在转换过程中会丢失操作链。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM