вы можете рассматривать 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