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

Я пытаюсь построить приближение нейронной сети к функции u, которая зависит от x (пространство) и t (время), то есть u (x, t).Для простоты x и t являются одномерными переменными в математической терминологии.

Примером функции потерь является (u (x, t) - \ int u (x, t) \, dx) ^ 2.Это только для целей моего вопроса.Функции потери, которые я рассматриваю, включают в себя интегральные слагаемые по x, но не по времени.

Для реализации этой функции потерь в идеале у меня должны быть точки (x_i, t_i), i = 1: N, и я хочуминимизировать потери \ sum_ {i = 1} ^ N (u (x_i, t_i) - \ int u (x, t_i) \, dx) ^ 2.

Интегральный член в функции потерь будетаппроксимируется с помощью численного интегрирования, такого как правило трапеции.

Мне удалось успешно реализовать это в Tensorflow, но все мои точки (x_i, t_i) были расположены в прямоугольной сетке, что удобно позволяло мне выполнять числовое интегрирование одновременноиспользуя векторизованные операции над тензорами, для которых был разработан Tensorflow.(Т. Е. (X_i, t_i) были получены с использованием сетки в numpy)

Теперь я хотел бы использовать точки без сетки для (x_i, t_i), таких как образцы латинского гиперкуба.Я буду ссылаться на эти точки без сетки как (xLHS, tLHS).Предположим, что вряд ли в tLHS есть повторяющиеся записи.В этом случае мне пришлось бы ввести другой набор точек xInt для численной оценки интеграла в любое время.Для конкретности предположим, что xInt = -5: 0,1: 5.(в нотации Matlab)

Теперь, чтобы вычислить потери, я могу изменить свой исходный код, где (x_i, t_i) были расположены в сетке, но теперь отдельно вычислять интегральный член в точках, которые можно получить, выполнив сетку сеткина tLHS и xInt и использовать векторизованные операции с тензорным потоком.Однако если tLHS имеет размер 20000, а xInt имеет размер 101, то результирующая сетка будет, вероятно, неразрешимой в тензорном потоке.

Другой вариант, который я подумал, заключался бы в цикле по каждому значению в tLHS и аппроксимации интеграла с помощью xInt.Это рекомендуется?Как бы я сохранил значение интеграла для каждой точки в tLHS, учитывая, что не просто назначить записи в тензоре?Я тоже думал о concat, но тогда, похоже, в тензорном потоке нет пустого тензора для инициализации цикла.

Если это помогает, x и t являются заполнителями в моем коде.

...