Работа метода Earth Mover Loss в Keras и типы данных входных аргументов - PullRequest
4 голосов
/ 08 мая 2020

Я нашел код потери Earth Mover Loss в Keras / Tensrflow. Я хочу подсчитать потери для оценок, присвоенных изображениям, но я не могу этого сделать, пока не узнаю, как работают потери Earth Mover Loss, указанные ниже. Может ли кто-нибудь описать, что происходит в коде.

Последний слой модели или выходной слой выглядит примерно так:

out = Dense(10,activation='softmax')(x)

Какими должны быть входные типы для этого метода. У меня есть y_labels в виде 1.2,4.9 эт c эт c. Я хочу использовать его с Keras / Tensorflow

def earth_mover_loss(y_true, y_pred):
    cdf_true = K.cumsum(y_true, axis=-1)
    cdf_pred = K.cumsum(y_pred, axis=-1)
    emd = K.sqrt(K.mean(K.square(cdf_true - cdf_pred), axis=-1))
    return K.mean(emd)

1 Ответ

2 голосов
/ 11 мая 2020

вы можете рассматривать EML как своего рода RMSE для функций вероятности CDF

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

EML просто сравнивает CDF прогнозов с реальностью

В задаче классификации с 10 классами для одной выборки, у нас могут быть эти массивы

y_true = [0,0,0,1,0,0,0,0,0,0] # образец принадлежит 4 классу

y_pred = [0.1,0,0,0.9,0,0,0,0,0,0] # выход вероятностей слоя softmax

по ним мы вычисляем CDF и получаем следующие оценки:

CDF_y_true = [0,0,0,1,1,1,1,1,1,1]

CDF_y_pred = [0,1,0.1,0.1,1,1,1,1,1,1, 1]

, как определено выше, EML вычисляет RMSE для этих CDF

y_true = np.asarray([0.,0.,0.,1.,0.,0.,0.,0.,0.,0.])
y_pred = np.asarray([0.1,0.,0.,0.9,0.,0.,0.,0.,0.,0.])

cdf_true = K.cumsum(y_true, axis=-1)
cdf_pred = K.cumsum(y_pred, axis=-1)
emd = K.sqrt(K.mean(K.square(cdf_true - cdf_pred), axis=-1))

В конкретном случае c NIMA Paper от Google на TID2013, N = 10 и метки express в форме чисел с плавающей запятой. Чтобы обучить сеть с помощью EML, необходимо выполнить следующие шаги:

  • оцифровка оценок с плавающей запятой за 10 интервалов
  • горячая кодировка меток для получения вероятностей softmax и минимизации EML

в конце поезда наша NN может произвести на заданном изображении оценку вероятности для каждого класса. мы должны преобразовать этот балл в средний балл качества с соответствующим стандартным отклонением, как определено в документе. для этого мы следуем процедуре, определенной в документе

bins = [1,2,3,4,5,6,7,8,9,10]

y_pred = [0.1 , 0,0,0.9,0,0,0,0,0,0] # вывод вероятностей слоя softmax

mu_score = sum (bins * y_pred) = 1 * 0.1 + 2 * 0 + 3 * 0 + 4 * 0,9 + ... + 10 * 0

sigma_score = sum (((bins - mu_score) ** 2) * y_pred) ** 0,5

bins = np.arange(1,11)
y_pred = np.asarray([0.1,0.,0.,0.9,0.,0.,0.,0.,0.,0.])

mu_score = np.sum(bins*y_pred)
std_score = np.sum(((bins - mu_score)**2)*y_pred)**0.5
...