Я пытаюсь создать слой сходства косинусов в Swift для Tensorflow, чтобы создать вложения слов.
Я пытался реализовать его с помощью тензорных функций в соответствии с определением в Википедии.
@differentiable
func cosineSimilarity(_ input: Tensor<Float>) -> Tensor<Float> {
// https://en.wikipedia.org/wiki/Cosine_similarity
let numerator = input.product(squeezingAxes: 1).sum(squeezingAxes: 1)
let denominator = sqrt(input.squared().sum(squeezingAxes: 1)).product(squeezingAxes: 1)
return numerator / denominator
}
Но это приводит к ошибке компиляции:
error: expression is not differentiable
let denominator = sqrt(input.squared().sum(squeezingAxes: 1)).product(squeezingAxes: 1)
С функцией highlihted product
. Поскольку продукт - просто сумма умножения, я ожидал, что это сработает. Если я пытаюсь создавать продукты вручную, для циклов, это работает, но это очень медленно.