Объекты Tensor не являются итеративными, когда активное выполнение не включено. Чтобы перебрать этот тензор, используйте `tf.map_fn`

Я пытаюсь создать свою собственную функцию потерь:

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`.

ошибка. Я не могу найти источник этой ошибки. Почему это происходит?

Спасибо за привет.

1 ответ

Ошибка происходит потому, что y_pred является тензором (не повторяемым без энергичного выполнения), и itertools.permutations ожидает, что итерация создаст перестановки из. Кроме того, часть, где вы вычисляете минимальные потери, также не будет работать, потому что значения тензора t неизвестны во время создания графа.

Вместо перестановки тензора я бы создал перестановки индексов (это то, что вы можете сделать во время создания графа), а затем собрал переставленные индексы из тензора. Предполагая, что ваш бэкэнд Keras - TensorFlow и что y_true/y_pred 2-мерные, ваша функция потерь может быть реализована следующим образом:

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
Другие вопросы по тегам