带有tf.contrib.losses.metric_learning.triplet_semihard_loss的keras模型断言错误

the*_*ter 5 python machine-learning deep-learning keras tensorflow

我正在将蟒蛇3与anaconda一起使用,并尝试在Keras模型中使用tf.contrib损失函数。

代码如下

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())
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

文件“ /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/siamese/lib/python3.6/site-packages/tensorflow/contrib/losses/python/metric_learning/metric_loss_ops.py“,行179,在Triplet_semihard_loss中断言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) 
Run Code Online (Sandbox Code Playgroud)

仍然出现相同的错误

我在这里做错了什么?

更新:更改功能时返回以下内容

return K.categorical_crossentropy(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)

一切正常!但是我无法使其与特定的tf损失功能一起使用...

当我进入tf.contrib.losses.metric_learning.triplet_semihard_loss并删除以下代码行:assert lshape.shape == 1运行正常

谢谢

Gab*_*ele -1

看来您的问题来自损失函数中的错误输入。事实上,三元组损失需要参数:

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.
Run Code Online (Sandbox Code Playgroud)

你确定它y_true的形状正确吗?您能给我们提供有关您正在使用的张量的更多详细信息吗?