Ошибка потери триплета Keras, когда batch_size> 1 - PullRequest
0 голосов
/ 16 октября 2019

Я реализую триплетную потерю в нейронной сети, состоящей из сверточной магистрали (с фиксированным размером 13x13x1024), за которой следует слой ROIPooling. Его выход (с фиксированным размером 3x3x1024) является входом плотного слоя, который генерирует окончательное встраивание. Наконец, я объединяю вложения со следующим кодом:

output = concatenate([embA, embP, embN], axis=-1, name='list_of_embds')
tripletModel = Model(inputs=[inputs...], outputs=output)


__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
img_A (InputLayer)              (None, None, None, 3 0                                            
__________________________________________________________________________________________________
img_P (InputLayer)              (None, None, None, 3 0                                            
__________________________________________________________________________________________________
img_N (InputLayer)              (None, None, None, 3 0                                            
__________________________________________________________________________________________________
backbone (Model)                (None, None, None, 1 40620640    img_A[0][0]                      
                                                                 img_P[0][0]                      
                                                                 img_N[0][0]                      
__________________________________________________________________________________________________
roi_A (InputLayer)              (None, 1, 4)         0                                            
__________________________________________________________________________________________________
roi_P (InputLayer)              (None, 1, 4)         0                                            
__________________________________________________________________________________________________
roi_N (InputLayer)              (None, 1, 4)         0                                            
__________________________________________________________________________________________________
branch_body (Model)             (None, 64)           9733696     backbone[1][0]                   
                                                                 roi_A[0][0]                      
                                                                 backbone[2][0]                   
                                                                 roi_P[0][0]                      
                                                                 backbone[3][0]                   
                                                                 roi_N[0][0]                      
__________________________________________________________________________________________________
list_of_embds (Concatenate)     (None, 192)          0           branch_body[1][0]                
                                                                 branch_body[2][0]                
                                                                 branch_body[3][0]                
==================================================================================================

И triplet_loss выглядит следующим образом:

def triplet_loss(y_true, y_pred, alpha = .2):

    total_lenght = y_pred.shape.as_list()[-1]
    anchor = y_pred[:,0:int(total_lenght*1/3)]
    positive = y_pred[:,int(total_lenght*1/3):int(total_lenght*2/3)]
    negative = y_pred[:,int(total_lenght*2/3):int(total_lenght*3/3)]

    # distance between the anchor and the positive
    pos_dist = K.sum(K.square(anchor-positive),axis=1)

    # distance between the anchor and the negative
    neg_dist = K.sum(K.square(anchor-negative),axis=1)

    # compute loss
    basic_loss = pos_dist-neg_dist+alpha
    loss = K.sum(K.maximum(basic_loss,0.0), axis=0)

    return loss

Обучение работает, когда batch_size равен 1, но происходит сбой с егозначение выше:

InvalidArgumentError: Inputs to operation training/Adam/gradients/loss/list_of_embds_loss/Maximum_grad/Select of type Select must have the same size and shape.  Input 0: [2] != input 1: [1]
     [[{{node training/Adam/gradients/loss/list_of_embds_loss/Maximum_grad/Select}}]]

Есть идеи о том, что происходит?

...