- Предположим, у вас есть
y_true
с формой (samples, 11)
, одна горячая кодировка. - Предположим, что вы используете
softmax
(сумма классов = 1) активации в последнем слое
Потери в Керасе имеют вид def func(y_true, y_pred):
import keras.backend as K
from keras.losses import categorical_crossentropy
def loss(y_true, y_pred):
#p
p = y_pred #(samples,11)
#j or k
j = K.cast_to_floatx(K.arange(10,21)) #(11,)
j = K.reshape(j, (1,-1)) #(1,11)
#y_true as class number
y = K.sum(y_true * j, axis=-1, keepdims=True) #(samples, 1)
#first term:
L1 = categorical_crossentropy(y_true, y_pred) #(samples,)
#second term with y outstide sum in j
kpk = j * p #(samples, 11)
kpkSum = K.sum(kpk, axis=-1, keepdims=True) #(samples, 1)
L2 = kpkSum - y #(samples, 1)
L2 = K.square(L2) / 2. #(samples, 1)
#third term:
L3 = K.square(j - kpkSum) #(samples,11)
L3 = p * L3 #(samples,11)
L3 = K.sum(L3, axis=-1) #(samples,)
return L1 + L2 + L3 #the mean in N is automatic by Keras