Implementando a função de perda personalizada em keras com tamanhos diferentes para y_true e y_pred
Eu sou novo em Keras. Preciso de ajuda para escrever uma função de perda personalizada em keras com back-end TensorFlow para a seguinte equação de perda.
Os parâmetros passados para a função de perda são:
y_true
seria de forma(batch_size, N, 2)
. Aqui, estamos passando N(x, y)
coordenadas em cada amostra do lote.y_pred
seria de forma(batch_size, 256, 256, N)
. Aqui, estamos passando por N mapas de calor previstos de256 x 256
pixels em cada amostra do lote.i
∈ [0, 255]
j
∈ [0, 255]
Mn(i, j)
representa valor no local do pixel(i, j)
para entãoº mapa de calor previsto.
Mn∼(i, j) = Guassian2D((i, j), y_truen, std)
Onde
std = standard deviation
, mesmo desvio padrão para as duas dimensões (5 px).
y_truen é entãoº (x, y) coordenada. Essa é a média.
$18 seria de forma19$Estimação de Pose Humana.
Nota: Mencionei batch_size na forma de y_true e y_pred. Supus que Keras chamasse a função de perda no lote inteiro e não em amostras individuais no lote. Corrija-me se eu estiver enganado.
def l2_loss(y_true, y_pred):
loss = 0
n = y_true.shape[0]
for j in range(n):
for i in range(num_joints):
yv, xv = tf.meshgrid(tf.arange(0, im_height), tf.arange(0, im_width))
z = np.array([xv, yv]).transpose(1, 2, 0)
ground = np.exp(-0.5*(((z - y_true[j, i, :])**2).sum(axis=2))/(sigma**2))
loss = loss + np.sum((ground - y_pred[j,:, :, i])**2)
return loss/num_joints
Este é o código que escrevi até agora. Eu sei que isso não funcionará, pois não podemos usar ndarrays numpy diretos dentro de uma função de perda keras. Além disso, eu preciso eliminar loops!