Функция потери Keras зависит от размера партии - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь построить функцию потерь в Керасе, в которой я штрафую минимальное расстояние между прогнозом и набором заданных значений.Проблема в том, что мне нужно рассчитать расстояние между прогнозируемыми значениями и заданными значениями.

Пример кода

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.Однако это дает ошибку, поскольку размер пакета не известен в явном виде при построении вычислительного графа.

Как мне избежать явного вещания?Есть ли более эффективный способ вычисления этой матрицы расстояний, поскольку нынешний метод очень неуклюжий?

1 Ответ

0 голосов
/ 31 января 2019

Ваша функция потерь может быть реализована с использованием неявного вещания следующим образом:

import keras.backend as K


def custom_loss(y_true, y_pred):
    centers = K.constant([[-2.5, -1], [-1.25, -2], [.5, -1], [1.5, .25]])

    # Expand dimensions to enable implicit broadcasting
    y_pred_r = y_pred[:, None, :]  # Shape: (batch_size, 1, 2)
    centers_r = centers[None, :, :]  # Shape: (1, nb_centers, 2)

    # Compute minimum distance to centers for each element
    distances = K.sqrt(K.sum(K.square(y_pred_r - centers_r), axis=-1))  # Shape=(batch_size, nb_centers)
    min_distances = K.min(distances, axis=-1)  # Shape=(batch_size,)

    # Output average of minimum distances
    return K.mean(min_distances)

ПРИМЕЧАНИЕ: Не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...