代码之家  ›  专栏  ›  技术社区  ›  thebeancounter

具有tf.contrib.loss.metric_learning.triplet_semihard_损失断言错误的keras模型

  •  2
  • thebeancounter  · 技术社区  · 7 年前

    from keras.layers import Dense, Flatten
    from keras.optimizers import Adam
    from keras.models import Sequential
    from tensorflow.contrib.losses import metric_learning
    model = Sequential()
    model.add(Flatten(input_shape=input_shape))
    model.add(Dense(50,  activation="relu"))
    model.compile(loss=metric_learning.triplet_semihard_loss, optimizer=Adam())
    

    “/home/user/.local/lib/python3.6/site-packages/keras/engine/training_-utils.py”, 第404行,以加权形式显示 score_array=fn(y_true,y_pred)文件“/home/user/anaconda3/envs/siames/lib/python3.6/site packages/tensorflow/contrib/loss/python/metric_learning/metric_loss_ops.py”, 第179行,三线半硬损耗 assert lshape.shape==1 AssertionError

    当我使用keras损耗函数的同一个网络时,它工作得很好,我尝试将tf损耗函数封装在这样一个函数中

    def func(y_true, y_pred): 
        import tensorflow as tf
        return tf.contrib.losses.metric_learning.triplet_semihard_loss(y_true, y_pred) 
    

    更新: 更改func以返回以下内容时

    return K.categorical_crossentropy(y_true, y_pred)
    

    一切正常!

    当我进入tf.contrib.loss.metric_learning.triplet_semihard_loss并删除这行代码时: assert lshape.shape == 1 它运行良好

    谢谢

    2 回复  |  直到 7 年前
        1
  •  1
  •   Misha Bortnikov    7 年前

    问题是您将错误的输入传递到损失函数。

    根据 triplet_semihard_loss docstring 你需要通过 labels embeddings .

    因此,您的代码必须是:

    def func(y, embeddings): 
        return tf.contrib.losses.metric_learning.triplet_semihard_loss(labels=y, embeddings=embeddings) 
    

    1. 最后的致密层必须无激活

    2. 别忘了将输出向量归一化 model.add(Lambda(lambda x: K.l2_normalize(x, axis=1)))

        2
  •  -1
  •   gab    7 年前

    Args:
    labels: 1-D tf.int32 `Tensor` with shape [batch_size] of
      multiclass integer labels.
    embeddings: 2-D float `Tensor` of embedding vectors. Embeddings should
      be l2 normalized.
    

    你确定吗 y_true 有正确的形状吗?你能给我们更多关于你使用的张量的细节吗?

    推荐文章