Как оценить B-сплайны в потере Кераса - PullRequest
1 голос
/ 19 января 2020

Я работаю над параметризацией узлов 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)

...