[英]keras model with tf.contrib.losses.metric_learning.triplet_semihard_loss Assertion error
我正在使用带有anaconda的python 3,并尝试使用带有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 loss函数包装在一个像这样的函数中
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损失函数...
当我进入tf.contrib.losses.metric_learning.triplet_semihard_loss并删除这行代码时: assert lshape.shape == 1
它运行正常
谢谢
问题是您将错误的输入传递给损失函数。
根据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)))
看来您的问题来自丢失函数中的错误输入。 事实上,三重态损失需要参数:
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
有正确的形状吗? 您能否提供有关您正在使用的张量的更多详细信息?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.