Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在Keras层内实现三重态损耗_Python 3.x_Keras_Keras Layer - Fatal编程技术网

Python 3.x 在Keras层内实现三重态损耗

Python 3.x 在Keras层内实现三重态损耗,python-3.x,keras,keras-layer,Python 3.x,Keras,Keras Layer,在这个博客中,他在Kears层之外实现了三重损失。他从网络中获取anchor\u out、pos\u out和neg\u out,然后将它们传递给他定义的triplet\u loss()函数 我想知道是否可以通过定义自己的Lambda层来计算Keras层中的三重态损耗 以下是我的网络设计: margin=1 anchor_input = Input((600, ), name='anchor') positive_input = Input((600, ), name='positive_in

在这个博客中,他在Kears层之外实现了三重损失。他从网络中获取
anchor\u out
pos\u out
neg\u out
,然后将它们传递给他定义的
triplet\u loss()
函数

我想知道是否可以通过定义自己的
Lambda
层来计算Keras层中的三重态损耗

以下是我的网络设计:

margin=1

anchor_input = Input((600, ), name='anchor')
positive_input = Input((600, ), name='positive_input')
negative_input = Input((600, ), name='negative_input')

# Shared embedding layer for positive and negative items
Shared_DNN = Dense(300)

encoded_anchor = Shared_DNN(anchor_input)
encoded_positive = Shared_DNN(positive_input)
encoded_negative = Shared_DNN(negative_input)

DAP = Lambda(lambda tensors:K.sum(K.square(tensors[0] - tensors[1]),axis=1,keepdims=True),name='DAP_loss') #Distance for Anchor-Positive pair
DAN = Lambda(lambda tensors:K.sum(K.square(tensors[0] - tensors[1]),axis=1,keepdims=True),name='DAN_loss') #Distance for Anchor-Negative pair
Triplet_loss = Lambda(lambda loss:K.max([(loss[0] - loss[1] + margin),0],axis=0),name='Triplet_loss') #Distance for Anchor-Negative pair

DAP_loss = DAP([encoded_anchor,encoded_positive])
DAN_loss = DAN([encoded_anchor,encoded_negative])

#call this layer on list of two input tensors.

Final_loss = Triplet_loss([DAP_loss,DAN_loss])

model = Model(inputs=[anchor_input,positive_input, negative_input], outputs=Final_loss)
但是,它给了我一个错误:

Tried to convert 'input' to a tensor and failed. Error: Shapes must be equal rank, but are 2 and 0
    From merging shape 0 with other shapes. for 'Triplet_loss_4/Max/packed' (op: 'Pack') with input shapes: [?,1], []
错误来自
Triplet\u loss
层。在
K.max()
函数中,第一个数字
loss[0]-loss[1]+margin
的形状为
(无,1)
。然而,第二个数字0的形状是
(1)
。这两个数字的形状不同,因此
K.max()
函数会给出一个错误

我的问题是,如何解决这个错误? 我尝试过用
K.constant(0,shape=(1,)
K.constant(0,shape=(None,1))
替换
0
,但它们不起作用。

这行吗

Triplet_loss = Lambda(lambda loss: K.maximum(loss[0] - loss[1] + margin, 0.0),
                      name='Triplet_loss')
我认为这条线的问题

Triplet_loss = Lambda(lambda loss:K.max([(loss[0] - loss[1] + margin), 0], 
                      axis=0),name='Triplet_loss') 
就是把
loss[0]-loss[1]+margin
张量和
0
放在列表括号中,keras将其解释为连接两个张量。由于大小不匹配,此操作失败
0
是一个标量,秩为0,而第一个是2d数组。这就是错误的含义


要将张量与单个值元素进行比较,请使用
K.max
,当其中一个参数是标量时,它会自动广播。

确实有效!我没有注意到
K.max()
K.max()
之间的细微差别,谢谢你指出这一点。