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

时间:2020-02-14 13:34:48

标签: 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
      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

我将从real_labelspredicted_labels获得start_rangeend_range个项目,但是当前代码返回一个异常:

错误:

TypeError: Failed to convert object of type <class 'list'> to Tensor.
Contents: [0, 1, None]. Consider casting elements to a supported type.

我不知道该怎么做,因为这是我第一次接触TensorFlowKeras。 如何使用张量索引来获取项目?预先感谢。

2 个答案:

答案 0 :(得分:0)

该错误是由于在None中指定了shape tf.placeholder而引起的,该错误发生在行

  batch_real_labels = tf.slice(real_labels, [start_range, 1, None], [end_range, 1, None])

解决方案是将variable定义为shape的{​​{1}},并使用placeholder代替variable

相同的代码如下所示:

None

此解决方法将修复错误h = tf.shape(losses)[0] batch_real_labels = tf.slice(real_labels, [start_range, 1, h], [end_range, 1, h]) ,但后续代码行可能会导致其他错误。

如果遇到其他错误,请共享TypeError: Failed to convert object of type <class 'list'> to Tensor. Contents: [0, 1, None]. Consider casting elements to a supported type.,包括功能error和目标的完整代码,以及使用该功能要实现的目标get_top_one_probability我会很乐意为您服务。

希望成为custom_lossTensorflow的新手,祝您学习愉快!

答案 1 :(得分:0)

请使用后端功能 K.reshape 根据您自己的知识来重塑输入标签和输入预测。

对于标签,输入是不确定的(?,?),因此您需要通过重塑形状来对其进行修复。否则,您将无法为其编制索引。