Я реализую триплетную потерю в нейронной сети, состоящей из сверточной магистрали (с фиксированным размером 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}}]]
Есть идеи о том, что происходит?