Keras文档中有一些尚不清楚的事情,我认为了解这些至关重要:
对于keras文档中的每个函数
Merge,都有一个小写和一个大写的定义,即
add()和
Add()。
在Github上,
farizrahman4u概述了不同之处:
Merge is a layer.Merge takes layers as inputMerge is usually used with Sequential modelsmerge is a function.merge takes tensors as input.merge is a wrapper around Merge.merge is used in Functional APIUsing Merge:left = Sequential()left.add(...)left.add(...)right = Sequential()right.add(...)right.add(...)model = Sequential()model.add(Merge([left, right]))model.add(...)using merge:a = Input((10,))b = Dense(10)(a)c = Dense(10)(a)d = merge([b, c])model = Model(a, d)
要回答您的问题,由于
Merge已弃用,因此我们必须为自己定义和构建一个层
cosinesimilarity。通常,这将涉及使用小写的函数,将它们包装在a中
Lambda以创建可在模型中使用的层。
我在这里找到了解决方案:
from keras import backend as Kdef cosine_distance(vests): x, y = vests x = K.l2_normalize(x, axis=-1) y = K.l2_normalize(y, axis=-1) return -K.mean(x * y, axis=-1, keepdims=True)def cos_dist_output_shape(shapes): shape1, shape2 = shapes return (shape1[0],1)distance = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([processed_a, processed_b]
根据您的数据,您可能需要删除L2规范化。关于该解决方案要注意的重要一点是,它是使用Keras函数api构建的,例如
K.mean()-我认为在定义自定义层甚至损失函数时这是必需的。
希望我清楚,这是我的第一个SO答案!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)