gpt4 book ai didi

python - 当未启用急切执行时,张量对象不可迭代。要迭代此张量,请使用 tf.map_fn

转载 作者:太空狗 更新时间:2023-10-29 20:19:34 25 4
gpt4 key购买 nike

我正在尝试创建自己的损失函数:

def custom_mse(y_true, y_pred):
tmp = 10000000000
a = list(itertools.permutations(y_pred))
for i in range(0, len(a)):
t = K.mean(K.square(a[i] - y_true), axis=-1)
if t < tmp :
tmp = t
return tmp

它应该创建预测向量的排列,并返回最小的损失。

   "Tensor objects are not iterable when eager execution is not "
TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn.

错误。我找不到此错误的任何来源。为什么会这样?

最佳答案

发生错误是因为 y_pred 是一个张量(不可迭代,无需急切执行),并且 itertools.permutations期望一个迭代来创建排列。此外,计算最小损失的部分也不起作用,因为张量 t 的值在图创建时是未知的。

我不会对张量进行排列,而是创建索引的排列(这是您可以在创建图形时执行的操作),然后从张量中收集排列后的索引。假设您的 Keras 后端是 TensorFlow 并且 y_true/y_pred 是二维的,您的损失函数可以按如下方式实现:

def custom_mse(y_true, y_pred):
batch_size, n_elems = y_pred.get_shape()
idxs = list(itertools.permutations(range(n_elems)))
permutations = tf.gather(y_pred, idxs, axis=-1) # Shape=(batch_size, n_permutations, n_elems)
mse = K.square(permutations - y_true[:, None, :]) # Shape=(batch_size, n_permutations, n_elems)
mean_mse = K.mean(mse, axis=-1) # Shape=(batch_size, n_permutations)
min_mse = K.min(mean_mse, axis=-1) # Shape=(batch_size,)
return min_mse

关于python - 当未启用急切执行时,张量对象不可迭代。要迭代此张量,请使用 tf.map_fn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com