Я пытаюсь создать собственную функцию потерь в Керасе.
Моя модель - это CNN для окраски изображений, и идея состоит в том, чтобы оштрафовать каждый предсказанный пиксель на основе его редкости в ранее измеренном распределении цвета пикселя по моему набору данных.
Функция потери получает предварительно вычисленные отношения каждого значения цвета к общему количеству пикселей из распределения.
Таким образом, я должен получить коэффициент для каждого истинного пикселя, который должен быть доступен в массиве отношений по индексу текущего значения пикселя.
Я построил «тупую» версию с потерями в NumPy, и она работает как положено.
Поскольку я пытаюсь преобразовать его в Tensorflow с помощью tf.map_fn , я не вижу способа реализовать это. Мои попытки запустить сеанс или оценить тензор не удаются.
Ниже представлена моя функция потерь.
def color_rebalancing_loss(ratios):
def loss(y_true, y_pred):
err = np.absolute(np.subtract(y_true, y_pred))
pixel_weight = tf.map_fn(lambda x: coefficient(x), y_true)
return err * pixel_weight
def coefficient(x):
x = tf.to_int32(x)
x = x.eval(session = tf.Session())
return 1/ratios[x]
return loss
Ошибка в этой строке
x = x.eval(session = tf.Session())
С этой ошибкой:
ValueError: Operation 'loss/activation_1_loss/map/while/TensorArrayReadV3' has been marked as not fetchable.
Мой поиск по Интернету не выявил каких-либо потенциальных исправлений, люди предлагают не выполнять итерации по массиву, использовать встроенную функцию тензорного потока, но получить доступ к
ratios[x]
является обязательным в этом случае.
Любые предложения будут оценены.