Вы можете использовать их так же, как вы бы манипулировали массивом numpy, хотя на этот раз y_true
и y_pred
являются тензорами, а не numpy массивами.
Посмотрите на этот пример:
def triplet_loss(y_true, y_pred, cosine=True, alpha=0.2, embedding_size=128):
ind = int(embedding_size * 2)
print('Shape of y pred is:', y_pred.shape)
a_pred = y_pred[:, :embedding_size]
p_pred = y_pred[:, embedding_size:ind]
n_pred = y_pred[:, ind:]
if cosine:
positive_distance = 1 - K.sum((a_pred * p_pred), axis=-1)
negative_distance = 1 - K.sum((a_pred * n_pred), axis=-1)
else:
positive_distance = K.sqrt(K.sum(K.square(a_pred - p_pred), axis=-1))
negative_distance = K.sqrt(K.sum(K.square(a_pred - n_pred), axis=-1))
loss = K.maximum(0.0, positive_distance - negative_distance + alpha)
return loss
На самом деле это функция потерь для конкретной c проблемы в сиамских сетях; но суть в том, что y_pred
управляется посредством нарезки.
Следовательно, вы можете нарезать / выбрать некоторые части y_true
и y_pred
в соответствии с вашими потребностями.