Я пытаюсь построить функцию потерь в Керасе, в которой я штрафую минимальное расстояние между прогнозом и набором заданных значений.Проблема в том, что мне нужно рассчитать расстояние между прогнозируемыми значениями и заданными значениями.
Пример кода
def custom_loss(y_pred,y_test):
#Given values
centers=K.constant([[-2.5,-1],[-1.25,-2],[.5,-1],[1.5,.25]])
num_centers=K.int_shape(centers)[0]
#Begin constructing distance matrix
height=K.int_shape(y_pred)[0]
i=0
current_center=K.reshape(K.repeat(K.reshape(centers[i,:],[1,-1]),height),[height,2])
current_dist=K.sqrt(K.sum(K.square(y_pred-current_center),axis=1))
#Values of distance matrix for first center
Distance=K.reshape(current_dist,[height,1])
for i in range(1,num_centers):
current_center=K.reshape(K.repeat(K.reshape(centers[i,:],[1,-1]),height),[height,2])
current_dist=K.sqrt(K.sum(K.square(y_pred-current_center),axis=-1))
current_dist=K.reshape(current_dist,[height,1])
#Iteratively concatenate distances of y_pred from remaining centers
Distance=K.concatenate([Distance,current_dist],axis=-1)
#Determine minimum distance from each predicted value to nearest center
A=K.min(A,axis=1)
#Return average minimum distance as loss
return K.sum(A)/float(height)
Однако я не могу удалить зависимость в функции от первого измерения y_pred, которое является переменной.Я использую широковещательную передачу массива, чтобы вычислить разницу между y_pred и каждым из заданных значений, но я явно транслирую, используя размер пакета, так как я не знаю, как это сделать без использования размера пакета в Keras.Однако это дает ошибку, поскольку размер пакета не известен в явном виде при построении вычислительного графа.
Как мне избежать явного вещания?Есть ли более эффективный способ вычисления этой матрицы расстояний, поскольку нынешний метод очень неуклюжий?