Я работаю над параметризацией узлов b-сплайнов и контрольных точек с глубоким обучением. Для этого у меня есть модель, которая выводит узлы и контрольные точки, и я хочу позволить модели учиться путем реализации пользовательской функции потерь, которая оценивает b-сплайн и затем вычисляет среднеквадратичную ошибку по фактической кривой. Надеемся, что модель научится выводить правильные узлы и контрольные точки.
Однако пользовательская функция потерь Keras требует, чтобы все операторы были включены в бэкэнд-функции. Начиная с scipy B-spline docs , эта функция будет выглядеть нормально.
def B(x, k, i, t):
if k == 0:
return 1.0 if t[i] <= x < t[i+1] else 0.0
if t[i+k] == t[i]:
c1 = 0.0
else:
c1 = (x - t[i])/(t[i+k] - t[i]) * B(x, k-1, i, t)
if t[i+k+1] == t[i+1]:
c2 = 0.0
else:
c2 = (t[i+k+1] - x)/(t[i+k+1] - t[i+1]) * B(x, k-1, i+1, t)
return c1 + c2
def bspline(x, t, c, k):
n = len(t) - k - 1
assert (n >= k+1) and (len(c) >= n)
return sum(c[i] * B(x, k, i, t) for i in range(n))
Я знаю, что для простых операторов, таких как суммирование, я могу использовать K.sum, а для операторов if-else я могу использовать K.switch. Однако я не знаю, как реализовать циклы for в Keras. Есть ли прямой способ вычисления кривых B-сплайнов в Керасе? (преобразование вышеуказанного кода в бэкэнд Keras)