Как написать пользовательскую функцию потерь в Tensorflow?

Я новичок в tensorflow. Я хочу написать свою собственную функцию потери. Есть ли учения об этом? Например, потеря циклы или sum_of_square_loss (хотя это уже в tf)? Могу ли я сделать это прямо в python или мне нужно написать код cpp?

Ответы

Ответ 1

Нам нужно записать функцию потерь. Например, мы можем использовать базовую среднеквадратичную ошибку в качестве функции потерь для прогнозируемых y и target y_:

 loss_mse = 1/n(Sum((y-y_)^2))

Существуют основные функции для тензоров, таких как tf.add(x,y), tf.sub(x,y), tf.square(x), tf.reduce_sum(x) и т. Д.

Затем мы можем определить функцию потерь в Tensorflow как:

cost = tf.reduce_mean(tf.square(tf.sub(y,y_)))

Примечание: y и y_ - тензоры.

Более того, мы можем определить любые другие функции потерь, если мы сможем записать уравнения. Для некоторых обучающих операторов (минимизаторов) функция потерь должна удовлетворять некоторым условиям (гладким, дифференцируемым...).

Одним словом, Tensorflow определяет массивы, константы, переменные в тензоры, определяет вычисления с использованием функций tf и использует сеанс для работы по графику. Мы можем определить, что нам нравится, и запустить его в конце.

Ответ 2

Взгляните на Добавление новой Op

Это может быть не совсем то, что вам нужно, но оно должно дать вам достаточно, чтобы начать.


Предпосылки:


Если вы хотите включить операцию, которая не покрывается существующей библиотекой, вы можете создать пользовательскую оп. Чтобы включить свою обычную Op, вам необходимо:

  • Зарегистрируйте новый Op в файле C++. Регистрация Op не зависит от реализации и описывает семантику вызова Op. Например, он определяет имя Op и определяет его входы и выходы.
  • Внесите Op в C++. Эта реализация называется "ядром", и может быть несколько ядер для разных архитектур (например, процессоров, графических процессоров) или типов ввода/вывода.

  • Создайте оболочку Python. Эта оболочка является общедоступным API для создания Op. Обертка по умолчанию создается из регистрации Op, которую можно использовать напрямую или добавить.

  • Необязательно, напишите функцию для вычисления градиентов для Op.

  • Необязательно, напишите функцию, которая описывает формы ввода и вывода для Op. Это позволяет сделать вывод о форме для работы с вашей Op.

  • Проверьте Op, как правило, на Python. Если вы определяете градиенты, вы можете проверить их с помощью Python GradientChecker.

Ответ 3

В дополнение к другому ответу вы можете написать функцию потерь в Python, если ее можно представить в виде композиции существующих функций.

Посмотрите, например, на реализацию ссылки sigmoid_cross_entropy_with_logits, которая реализована с использованием базовых преобразований.

Ответ 4

Практически во всех обучающих курсах tensorflow используются пользовательские функции. Например, в самом начале учебника они пишут пользовательскую функцию:

суммирует квадраты дельт между текущей моделью и предоставленными данными

squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)

В следующем MNIST для начинающих они используют кросс-энтропию:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

Как вы видите, это не так сложно: вам просто нужно закодировать свою функцию в тензорном формате и использовать их основные функции.

Например, вот как вы можете реализовать оценку F-беты (общий подход к оценке F1). Его формула:

enter image description here

Единственное, что нам нужно сделать, это найти, как вычислять true_positive, false_positive, false_negative для значений boolean или 0/1. Если у вас есть векторы значений 0/1, вы можете рассчитать каждое из значений как:

TP = tf.count_nonzero(actual, predicted)
FP = tf.count_nonzero((actual - 1) * predicted)
FN = tf.count_nonzero((predicted - 1) * actual)

Теперь, когда вы знаете эти значения, вы можете легко получить свой

denom = (1 + b**2) * TP + b**2 TN + FP
Fb = (1 + b**2) * TP / denom