我在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_labels
到predicted_labels
获得start_range
和end_range
个项目,但是当前代码返回一个异常:
错误:
TypeError: Failed to convert object of type <class 'list'> to Tensor.
Contents: [0, 1, None]. Consider casting elements to a supported type.
我不知道该怎么做,因为这是我第一次接触TensorFlow
和Keras
。
如何使用张量索引来获取项目?预先感谢。
答案 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_loss
和Tensorflow
的新手,祝您学习愉快!
答案 1 :(得分:0)
请使用后端功能 K.reshape 根据您自己的知识来重塑输入标签和输入预测。
对于标签,输入是不确定的(?,?),因此您需要通过重塑形状来对其进行修复。否则,您将无法为其编制索引。