我遇到了一个暹罗网络的Keras代码,其中两个大小分别为(?128)的ndarray传递给一个层以获取它们之间的差,然后传递给Lambda层以获取结果数组的平方平方和,这样做的目的是获得两个初始数组之间的欧式距离

embedded_distance = layers.Subtract(name='subtract_embeddings')([encoded_1, encoded_2])

embedded_distance = layers.Lambda(lambda x: K.sqrt(K.sum(K.square(x), axis=-1, keepdims=True)), name='euclidean_distance')(embedded_distance)

令我困惑的是,根据模型的视觉架构,该层的输出大小以及随后的密集层的输入大小也都是大小(?,128),难道不应该仅仅是一个号码?否则sum方法如何工作?

如果有人感兴趣,这里是课程的链接,以及视觉架构。 (注意:此代码对我来说是不变的,并且在我用它训练模型后可以正常工作)

http://codebin.herokuapp.com/?s=5e162c612cdd6f0004000001

https://imgur.com/a/zC7Uyfm

最佳答案

您报告的问题与您正在使用的事实有关

distance_metric == 'weighted_l1'


您应该更改此行代码

embedded_distance = layers.Lambda(lambda x: K.abs(x))(embedded_distance)




embedded_distance = layers.Lambda(
        lambda x: K.sum(K.abs(x), axis=-1, keepdims=True),
        name='euclidean_distance')(embedded_distance)


还要注意,添加output = layers.Dense(1, activation='sigmoid')(embedded_distance)不会引起兴趣,因为在这种情况下,shi层的输入已经是标量。

关于python - 克拉斯的欧式距离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59659494/

10-09 01:08