Эффективный метод TensorFlow позволяет вычислять кубические полиномы с учетом тензора коэффициентов и тензора значений x - PullRequest
0 голосов
/ 11 октября 2019

Мне нужно решить много кубических многочленов, учитывая форму [n] Тензор TensorFlow со значениями x и соответствующий [n, 4] тензор коэффициентов. У меня есть рабочий код, который делает это, но я не уверен, правильно ли я это делаю. Я новичок в работе с тензорами, и мои общие навыки линейной алгебры не такие, какими они должны быть, поэтому я ищу отзывы о других потенциальных методах. Я особенно пытаюсь оптимизировать производительность GPU.

Я делаю это в экспериментальном Swift для TensorFlow, так вот в чем пример кода, но я спрашиваю об операциях, а не о языке, поэтомуэто не должно иметь значения. Ответы выражены на Python, и все в порядке.


Кубические полиномы имеют форму ax^3 + bx^2 + cx + d. Очевидный способ представить это в тензорной форме - это скалярное произведение [a, b, c, d] . [x^3, x^2, x, 1].

Наивная попытка

  // Testing values
  let xValues = Tensor<Float>([0, 0.5, 1, 3.141])
  let coefficients = Tensor<Float>([ [0, 0, 0, 0], [1, 1, 1, 1], [0, 1, 2, 3], [3, 2, 1, 0] ])

  // Takes [x1, x2, ...] to [[x1, x1, x1, x1], [x2, x2, x2, x2], ...]
  // There's probably a much nicer way of doing this with broadcasting or something.
  // This is probably horrible for memory use - I'm duplicating data just to do an op.
  let duplicatedXValues = Tensor<Float>(stacking: [xValues, xValues, xValues, xValues], alongAxis: 1)

  // Takes [[x1, x1, x1, x1], [x2, x2, x2, x2], ...] to [[x1^3, x1^2, x1, 1], [x2^3, x2^2, x2, 1], ...]
  let xValuesPowers = duplicatedXValues.cumulativeProduct(alongAxis: 1, exclusive: true, reverse: true)

  // Sum along squeezing axes is Swift speak for reduce_sum.
  // Seems to produce correct answers.
  let evaluatedPolynomials = (xValuesPowers * coefficients).sum(squeezingAxes: 1)

Здесь я дублирую xValues в памяти, чтобы произвести различные способностиЭто кажется ужасной идеей, потому что мне нужен только тензор промежуточных степеней для одной операции. Возможно, оптимизатор просто исправит это для меня, но я не уверен и не знаю, как это проверить.

Возможно, есть способ сделать это без duplicatedXValues и xValuesPowers, ноЯ не уверен, как обращаться с показателями в одном тензоре оп. Возможно, мне не хватает трюка с линейной алгеброй, и, возможно, есть способ использовать мой текущий метод без нежелательного использования дополнительной памяти.

Какой самый хороший (самый быстрый на GPU) способ сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...