我目前正在尝试在Keras实现一个暹罗网,我必须实现以下丢失功能:
loss(p ? q) = Is · KL(p ? q) + Ids · HL(p ? q)
Run Code Online (Sandbox Code Playgroud)
KL是Kullback-Leibler分歧,HL是铰链损失.
在训练期间,我将同一个扬声器对标记为1,将不同的扬声器标记为0.
目标是使用训练好的网络从频谱图中提取嵌入.频谱图是二维numpy阵列40x128(时间x频率)
问题是我从未达到0.5准确度,并且当聚类扬声器嵌入时结果显示嵌入和扬声器之间似乎没有相关性
我实施了kb-散度作为距离测量,并相应地调整了铰链损耗:
def kullback_leibler_divergence(vects):
x, y = vects
x = ks.backend.clip(x, ks.backend.epsilon(), 1)
y = ks.backend.clip(y, ks.backend.epsilon(), 1)
return ks.backend.sum(x * ks.backend.log(x / y), axis=-1)
def kullback_leibler_shape(shapes):
shape1, shape2 = shapes
return shape1[0], 1
def kb_hinge_loss(y_true, y_pred):
"""
y_true: binary label, 1 = same speaker
y_pred: output of siamese net i.e. kullback-leibler distribution
"""
MARGIN = 1.
hinge = ks.backend.mean(ks.backend.maximum(MARGIN …Run Code Online (Sandbox Code Playgroud)