我正在将蟒蛇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())
我收到以下错误:
文件 “ /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)
仍然出现相同的错误
我在这里做错了什么?
更新: 更改功能以返回以下
时return K.categorical_crossentropy(y_true, y_pred)
一切正常! 但是我无法使其与特定的tf损失功能一起使用...
当我进入tf.contrib.losses.metric_learning.triplet_semihard_loss并删除以下代码行:assert lshape.shape == 1
时,它运行正常
谢谢
答案 0 :(得分:0)
问题是您将错误的输入传递给了损失函数。
根据triplet_semihard_loss docstring,您需要传递labels
和embeddings
。
因此您的代码必须是:
def func(y, embeddings):
return tf.contrib.losses.metric_learning.triplet_semihard_loss(labels=y, embeddings=embeddings)
还有两个有关嵌入网络的说明:
最后一个致密层必须没有激活
别忘了标准化输出向量model.add(Lambda(lambda x: K.l2_normalize(x, axis=1)))
答案 1 :(得分:-1)
您的问题似乎来自丢失函数中的错误输入。实际上,三重态损失需要以下参数:
Ready to exec()...
Tue Jul 15 20:17:53 UTC 2008
您确定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.
的形状正确吗?您能为我们提供有关您所使用的张量的更多详细信息吗?