Python 使用Keras的自定义损失函数中的索引张量

Python 使用Keras的自定义损失函数中的索引张量,python,tensorflow,keras,tensor,Python,Tensorflow,Keras,Tensor,我正在Keras中使用自定义损失函数。 这就是功能: def custom_loss(groups_id_count): def listnet_loss(real_labels, predicted_labels): losses = tf.placeholder(shape=[None], dtype=tf.float32) # Tensor of rank 1 for group in groups_id_count: start_range = 0

我正在
Keras
中使用自定义损失函数。 这就是功能:

def custom_loss(groups_id_count):
  def listnet_loss(real_labels, predicted_labels):
    losses = tf.placeholder(shape=[None], dtype=tf.float32) # Tensor of rank 1
    for group in groups_id_count:
      start_range = 0
      end_range = (start_range + group[1])
      batch_real_labels = tf.slice(real_labels, [start_range, 1, None], [end_range, 1, None])
      batch_predicted_labels = tf.slice(predicted_labels, [start_range, 0, 0], [end_range, 0, 0])
      loss = -K.sum(get_top_one_probability(batch_real_labels)) * tf.math.log(get_top_one_probability(batch_predicted_labels))
      losses = tf.concat([losses, loss], axis=0)
      start_range = end_range
    return K.mean(losses)
  return listnet_loss
我将从
start\u range
end\u range
获取
real\u标签
predicted\u标签
项,但当前代码返回异常:

错误:

TypeError: Failed to convert object of type <class 'list'> to Tensor.
Contents: [0, 1, None]. Consider casting elements to a supported type.
TypeError:无法将类型的对象转换为Tensor。
内容:[0,1,无]。将铸造元素考虑为支持类型。
我不知道该怎么办,因为这是我第一次体验
TensorFlow
Keras

如何使用张量上的索引获取项目?提前感谢。

错误是因为
占位符
中指定的
形状
,并且它发生在行中

  batch_real_labels = tf.slice(real_labels, [start_range, 1, None], [end_range, 1, None])
解决方法是将
变量
定义为该
占位符
形状
,并使用该
变量
而不是

其代码如下所示:

h = tf.shape(losses)[0]
batch_real_labels = tf.slice(real_labels, [start_range, 1, h], [end_range, 1, h])
此解决方法将修复错误,
TypeError:无法将类型的对象转换为Tensor。内容:[0,1,无]。将铸造元素考虑为支持类型。< /代码>但随后的代码行可能会导致其他错误。

如果您遇到任何其他错误,请分享
错误
,完整的代码,包括函数,
获取最高概率
,以及目标,例如,您使用该函数想要实现什么,
自定义损失
,我可以很高兴地帮助您


作为
Tensorflow
Keras
的新手,祝您学习愉快

错误是由于
tf.placeholder
中指定了
None
形状
,并且它发生在行中

  batch_real_labels = tf.slice(real_labels, [start_range, 1, None], [end_range, 1, None])
解决方法是将
变量
定义为该
占位符
形状
,并使用该
变量
而不是

其代码如下所示:

h = tf.shape(losses)[0]
batch_real_labels = tf.slice(real_labels, [start_range, 1, h], [end_range, 1, h])
此解决方法将修复错误,
TypeError:无法将类型的对象转换为Tensor。内容:[0,1,无]。将铸造元素考虑为支持类型。< /代码>但随后的代码行可能会导致其他错误。

如果您遇到任何其他错误,请分享
错误
,完整的代码,包括函数,
获取最高概率
,以及目标,例如,您使用该函数想要实现什么,
自定义损失
,我可以很高兴地帮助您


作为
Tensorflow
Keras
的新手,祝您学习愉快

请使用后端函数K.reforme根据您自己的知识对输入标签和输入预测进行重塑


对于标签,输入是未定义的(?,),因此需要通过重塑它来修复它。否则,您将无法对其编制索引。

请使用后端函数K.Reformate根据您自己的知识对输入标签和输入预测进行重塑


对于标签,输入是未定义的(?,),因此需要通过重塑它来修复它。否则,您无法对其编制索引。

Hi@pairon,请提供最小可复制代码。Hi@pairon,请提供最小可复制代码。