Большое спасибо за подробное объяснение, вы только что спасли мой день.
ичок в Керасе. Мне нужна помощь в написании пользовательской функции потерь в кератах с бэкэндом TensorFlow для следующего уравнения потерь.
Параметры, передаваемые в функцию потерь:
y_true
будет иметь форму(batch_size, N, 2)
, Здесь мы проходим N(x, y)
координаты в каждом образце в партии.y_pred
будет иметь форму(batch_size, 256, 256, N)
, Здесь мы передаем N предсказанных тепловых карт256 x 256
пикселей в каждом образце в пакете.i
∈ [0, 255]
j
∈ [0, 255]
Mn(i, j)
представляет значение в месте расположения пикселя(i, j)
тогдаго прогнозируемая тепловая карта.
Mn∼(i, j) = Guassian2D((i, j), y_truen, std)
где
std = standard deviation
, то же стандартное отклонение для обоих размеров (5 пикселей).
y_truen затемго (х, у) координата. Это среднее.
$18 будет иметь форму19$Оценка позы человека.
Примечание: я упомянул batch_size в форме y_true и y_pred. Я предположил, что Keras вызывает функцию потерь для всей партии, а не для отдельных выборок в партии. Поправь меня, если я ошибаюсь.
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
Это код, который я написал до сих пор. Я знаю, что это не будет работать, так как мы не можем использовать прямые нудистые ndarrays внутри функции потери keras. Также мне нужно устранить петли!