[英]TypeError: 'Tensor' object does not support item assignment in TensorFlow
[英]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 中的项目分配
下一篇较长的文章很有帮助,它建议根据条件进行分解,然后重新制作张量。 我仍在努力使用这种方法找到解决方案:
不幸的是,由于我的张量的尺寸是(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 中的张量是不可变的,因此您不能将值分配给数组中的索引。 两种解决方法:
定义使用原始张量和一些附加操作创建的新张量。 我建议使用tf.keras.backend.switch()
,它允许您根据张量从两个输入张量之一(对您来说将是 -10 的张量和 10 的张量)之一为新张量分配值boolean 值(对你来说这可能是 idx_maxes?)
转换为 numpy arrays,根据需要进行更改,然后转换回张量。 请注意,这仅在您处于急切执行模式时才有效。 如果您处于图形模式,直观地转换为 numpy 是不行的,因为 numpy arrays 不支持图形计算,因此在转换过程中会丢失操作链。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.