Как преобразовать эту функцию потерь, написанную в лазанье, в Keras? - PullRequest
0 голосов
/ 25 апреля 2019

Я работал над преобразованием CNN, написанного в Lasagne, в Keras (ссылка на версию Lasagne: https://github.com/MTG/DeepConvSep/blob/master/examples/dsd100/trainCNN.py). Я думаю, что у меня есть большая часть этого, но функция потерь - это часть, которую яЯ изо всех сил пытаюсь переписать.

Выход сети имеет форму (32 513,30,4), а функция потерь использует разные слои (последний тусклый). Я пытался переписать его как пользовательские потерифункция, которую я мог бы просто подключить к model.compile () Вот код, который я написал:


rand_num = np.random.uniform(size=(32,513,30,1))
epsilon=1e-8                                        
alpha=0.001                                        
beta=0.01                                          
beta_voc=0.03 

def loss_func(y_true, y_pred):

    global alpha, beta, beta_voc, rand_num

    voc =  y_pred[:,:,:,0:1] + epsilon * rand_num
    bass = y_pred[:,:,:,1:2] + epsilon * rand_num
    dru = y_pred[:,:,:,2:3] + epsilon * rand_num
    oth = y_pred[:,:,:,3:4] + epsilon * rand_num

    mask_vox = voc/(voc+bass+dru+oth)
    mask_bass = bass/(voc+bass+dru+oth)
    mask_drums = dru/(voc+bass+dru+oth)
    mask_oth = oth/(voc+bass+dru+oth)

    vocals = mask_vox * inp
    bass = mask_bass * inp
    drums = mask_drums * inp
    other = mask_oth * inp

    train_loss_vocals = mean_squared_error(y_true=y_true[:,:,:,0:1],y_pred=vocals)
    alpha_component = alpha*mean_squared_error(y_true=y_true[:,:,:,1:2],y_pred=vocals)
    alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,2:3],y_pred=vocals)
    train_loss_recon_neg_voc = beta_voc*mean_squared_error(y_true=y_true[:,:,:,3:4],y_pred=vocals)

    train_loss_bass = mean_squared_error(y_true=y_true[:,:,:,1:2],y_pred=bass)
    alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,0:1],y_pred=bass)
    alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,2:3],y_pred=bass)
    train_loss_recon_neg = beta*mean_squared_error(y_true=y_true[:,:,:,3:4],y_pred=bass)

    train_loss_drums = mean_squared_error(y_true=y_true[:,:,:,2:3],y_pred=drums)
    alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,0:1],y_pred=drums)
    alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,1:2],y_pred=drums)
    train_loss_recon_neg += beta*mean_squared_error(y_true=y_true[:,:,:,3:4],y_pred=drums)

    vocals_error=train_loss_vocals.sum()
    drums_error=train_loss_drums.sum()
    bass_error=train_loss_bass.sum()
    negative_error=train_loss_recon_neg.sum()
    negative_error_voc=train_loss_recon_neg_voc.sum()
    alpha_component=alpha_component.sum()

    loss=abs(vocals_error+drums_error+bass_error-negative_error-alpha_component-negative_error_voc)

    return loss 

Первая ошибка, которую я получаю:

AttributeError: 'Tensor 'object не имеет атрибута' sum '

Однако я не уверен, что некоторые другие операции, даже если они неправильные, приведут к ошибке.

Буду очень признателен за помощьСпасибо.

1 Ответ

0 голосов
/ 26 апреля 2019

См., Например, этот пример того, как определить пользовательские потери в Keras.

y_pred, являющийся выходом модели Keras, является тензорным.Вы должны адаптировать свои операции для работы с тензорами, поэтому вместо чего-то вроде np.sum вам придется использовать K.sum, где K - ваш бэкэнд-керас.

Некоторые операторы перегружены, так что вы можете, например,добавьте два тензора, используя +.

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