Мне нужно решить много кубических многочленов, учитывая форму [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) способ сделать это