我遇到了一个暹罗网络的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/