首页 > 解决方案 > 使用 keras 进行 RNN 的三元组网络

问题描述

我正在尝试为三元组损失(使用 keras)编写一个自定义损失函数,它需要 3 个参数锚,正数和负数。三元组是使用 gru 层生成的,model.fit 的参数是通过数据生成器提供的。

我面临的问题是在训练时:

TypeError: Cannot convert a symbolic Keras input/output to a numpy array. 
This error may indicate that you're trying to pass a symbolic value to a NumPy 
call, which is not supported. Or, you may be trying to pass Keras symbolic 
inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically 
converting the API call to a lambda layer in the Functional Model.

损失函数的实现

def batch_hard_triplet_loss(self, anchor_embeddings, pos_embeddings, neg_embeddings, margin):
    def loss(y_true, y_pred):
        '''print(anchor_embeddings)
        print(pos_embeddings)
        print(neg_embeddings)'''
        # distance between the anchor and the positive
        pos_dist = K.sum(K.square(anchor_embeddings - pos_embeddings), axis=-1)
        max_pos_dist = K.max(pos_dist)
        # distance between the anchor and the negative
        neg_dist = K.sum(K.square(anchor_embeddings - neg_embeddings), axis=-1)
        max_neg_dist = K.min(neg_dist)
        # compute loss
        basic_loss = max_pos_dist - max_neg_dist + margin
        tr_loss = K.maximum(basic_loss, 0.0)
        return tr_loss
    #return triplet_loss

    return loss

这可能是因为 keras 期望数组作为返回的损失,但我提供了一个标量值吗?

标签: pythontensorflowkerassiamese-networktriplet

解决方案


推荐阅读