1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Python_Ai_Road-eat_tensorflow2_in_30_days

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
5-5,损失函数losses.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 03.12.2024 15:14 374a95e

5-5, потери функции потерь

Как правило, целевая функция в обучении с учителем состоит из функции потерь и члена регуляризации. (Objective = Loss + Regularization)

Для модели Keras член регуляризации в целевой функции обычно указывается на каждом уровне, например, можно указать использование регуляризации L1 или L2 для весов, используя такие параметры, как kernel_regularizer и bias_regularizer в Dense, а также можно использовать параметры kernel_constraint и bias_constraint для ограничения диапазона значений весов, что также является своего рода регуляризацией.

Функция потерь задается при компиляции модели. Для регрессионных моделей обычно используется функция потерь среднеквадратичной ошибки mean_squared_error.

Для бинарных классификационных моделей обычно используется бинарная кросс-энтропийная функция потерь binary_crossentropy.

Для многоклассовых моделей, если метка закодирована one-hot, следует использовать категориальную кросс-энтропийную функцию потерь categorical_crossentropy. Если метка закодирована номерами классов, необходимо использовать разреженную категориальную кросс-энтропийную функцию потерь sparse_categorical_crossentropy.

При необходимости можно также определить пользовательскую функцию потерь. Пользовательская функция потерь должна принимать два тензора y_true и y_pred в качестве входных параметров и выводить одно скалярное значение в качестве значения функции потерь.

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers,models,losses,regularizers,constraints

I. Функция потерь и член регуляризации

tf.keras.backend.clear_session()

model = models.Sequential()
model.add(layers.Dense(64, input_dim=64,
                kernel_regularizer=regularizers.l2(0.01), 
                activity_regularizer=regularizers.l1(0.01),
                kernel_constraint = constraints.MaxNorm(max_value=2, axis=0))) 
model.add(layers.Dense(10,
        kernel_regularizer=regularizers.l1_l2(0.01,0.01),activation = "sigmoid"))
model.compile(optimizer = "rmsprop",
        loss = "binary_crossentropy",metrics = ["AUC"])
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 64)                4160      
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 4,810
Trainable params: 4,810
Non-trainable params: 0
_________________________________________________________________

II. Встроенные функции потерь

Встроенные функции потерь обычно имеют две формы реализации: класс и функцию. Например, CategoricalCrossentropy и categorical_crossentropy являются категориальными функциями кросс-энтропии, первая — это реализация класса, вторая — реализация функции. Некоторые часто используемые встроенные функции потерь описаны ниже.

  • mean_squared_error (среднеквадратическая ошибка потерь, используемая для регрессии, сокращенно mse, реализация класса и функции — MeanSquaredError и MSE соответственно).
  • mean_absolute_error (средняя абсолютная ошибка потерь, используется для регрессии, сокращается до mae, реализация класса и функции — MeanAbsoluteError и MAE соответственно).
  • mean_absolute_percentage_error (средняя процентная ошибка потерь, используется для регрессии, сокращается до mape, реализация класса и функции — MeanAbsolutePercentageError и MAPE соответственно).
  • Huber (потеря Хубера, только реализация класса, используется для регрессии, находится между mse и mae, относительно устойчив к выбросам, имеет определенные преимущества перед mse).
  • binary_crossentropy (двоичная кросс-энтропия, используется для двоичной классификации, реализация класса — BinaryCrossentropy).
  • categorical_crossentropy (категориальная кросс-энтропия, используется для многоклассовой классификации, требует кодирования меток one-hot, реализация класса — CategoricalCrossentropy).
  • sparse_categorical_crossentropy (разреженная категориальная кросс-энтропия, используется для многоклассовой классификации, требуется кодирование меток порядковыми номерами, реализация класса — SparseCategoricalCrossentropy).
  • hinge (потери шарнира, используются для двоичной классификации, наиболее известное применение — в качестве функции потерь для поддержки векторных машин SVM, реализация класса — Hinge).
  • kld (относительная энтропийная потеря, также называемая KL-расхождением, часто используется в качестве функции потерь в алгоритме EM максимального ожидания, измерение разницы между двумя распределениями вероятностей, реализация класса и функции — KLDivergence или KLD соответственно).
  • cosine_similarity (косинусное сходство, может использоваться для многоклассовой классификации, реализация класса — CosineSimilarity).

III. Пользовательские функции потерь

Пользовательская функция потерь принимает два тензора y_true и y_pred в качестве входных данных и выводит одно скалярное значение как значение функции потерь. Можно также создать подкласс tf.keras.losses.Loss и переопределить метод call для реализации логики вычисления потерь, чтобы получить реализацию функции потерь на уровне класса. Ниже приведен пример пользовательской реализации Focal Loss, которая представляет собой улучшенную форму функции потерь binary_crossentropy. Она имеет явные преимущества по сравнению с binary_crossentropy при несбалансированных выборках и наличии большого количества легко классифицируемых выборок. У нее есть два настраиваемых параметра: alpha и gamma. Параметр alpha в основном используется для уменьшения веса отрицательных образцов, а параметр gamma — для уменьшения веса легко обучаемых образцов. Это позволяет модели сосредоточиться на положительных и трудных образцах. Вот почему эта функция потерь называется Focal Loss. Подробнее см. в статье «5 минут понимания Focal Loss и GHM — решение проблемы несбалансированности выборки». https://zhuanlan.zhihu.com/p/80594704 $$focal_loss(y,p) = \begin{cases} -\alpha (1-p)^{\gamma}\log(p) & \text{if y = 1}\\ -(1-\alpha) p^{\gamma}\log(1-p) & \text{if y = 0} \end{cases} $$

def focal_loss(gamma=2., alpha=0.75):
    
    def focal_loss_fixed(y_true, y_pred):
        bce = tf.losses.binary_crossentropy(y_true, y_pred)
        p_t = (y_true * y_pred) + ((1 - y_true) * (1 - y_pred))
        alpha_factor = y_true * alpha + (1 - y_true) * (1 - alpha)
        modulating_factor = tf.pow(1.0 - p_t, gamma)
        loss = tf.reduce_sum(alpha_factor * modulating_factor * bce,axis = -1 )
        return loss
    return focal_loss_fixed
class FocalLoss(tf.keras.losses.Loss):
    
    def __init__(self,gamma=2.0,alpha=0.75,name = "focal_loss"):
        self.gamma = gamma
        self.alpha = alpha

    def ```
call(self,y_true,y_pred):
        bce = tf.losses.binary_crossentropy(y_true, y_pred)
        p_t = (y_true * y_pred) + ((1 - y_true) * (1 - y_pred))
        alpha_factor = y_true * self.alpha + (1 - y_true) * (1 - self.alpha)
        modulating_factor = tf.pow(1.0 - p_t, self.gamma)
        loss = tf.reduce_sum(alpha_factor * modulating_factor * bce,axis = -1 )
        return loss

Если у вас есть вопросы по содержанию этой книги, пожалуйста, оставьте комментарий в нашем публичном аккаунте «Алгоритм и кулинария». Автор ответит на них, когда сможет.

Вы также можете оставить сообщение с ключевым словом присоединиться к группе в фоновом режиме публичного аккаунта, чтобы присоединиться к дискуссионной группе читателей.

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
git@api.gitlife.ru:oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
oschina-mirror
Python_Ai_Road-eat_tensorflow2_in_30_days
Python_Ai_Road-eat_tensorflow2_in_30_days
master