|
|
|
import tensorflow.keras.backend as K |
|
|
|
|
|
ALPHA = 0.1 |
|
|
|
|
|
def batch_cosine_similarity(x1, x2): |
|
|
|
|
|
dot = K.squeeze(K.batch_dot(x1, x2, axes=1), axis=1) |
|
|
|
return dot |
|
|
|
|
|
def deep_speaker_loss(y_true, y_pred, alpha=ALPHA): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
split = K.shape(y_pred)[0] // 3 |
|
|
|
anchor = y_pred[0:split] |
|
positive_ex = y_pred[split:2 * split] |
|
negative_ex = y_pred[2 * split:] |
|
|
|
|
|
|
|
|
|
|
|
|
|
sap = batch_cosine_similarity(anchor, positive_ex) |
|
san = batch_cosine_similarity(anchor, negative_ex) |
|
loss = K.maximum(san - sap + alpha, 0.0) |
|
total_loss = K.mean(loss) |
|
return total_loss |
|
|
|
|
|
if __name__ == '__main__': |
|
import numpy as np |
|
|
|
print(deep_speaker_loss(alpha=0.1, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
print(deep_speaker_loss(alpha=1, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
print(deep_speaker_loss(alpha=2, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
print('--------------') |
|
print(deep_speaker_loss(alpha=2, y_true=0, y_pred=np.array([[0.6], [1.0], [0.0]]))) |
|
print(deep_speaker_loss(alpha=1, y_true=0, y_pred=np.array([[0.6], [1.0], [0.0]]))) |
|
print(deep_speaker_loss(alpha=0.1, y_true=0, y_pred=np.array([[0.6], [1.0], [0.0]]))) |
|
print(deep_speaker_loss(alpha=0.2, y_true=0, y_pred=np.array([[0.6], [1.0], [0.0]]))) |
|
|
|
print('--------------') |
|
print(deep_speaker_loss(alpha=2, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
print(deep_speaker_loss(alpha=1, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
print(deep_speaker_loss(alpha=0.1, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
print(deep_speaker_loss(alpha=0.2, y_true=0, y_pred=np.array([[0.9], [1.0], [-1.0]]))) |
|
|