Я пытаюсь реализовать пользовательскую функцию потерь (основанную на последовательных фильтрах частиц Монте-Карло) в tensorflow
, которая включает процедуру повторной выборки, но я не могу понять, как правильно выполнить индексацию, чтобы она может быть запущен в течение tf.Session()
Эквивалентная функция python:
import numpy as np
N = [1000, 1]
ind = np.arange(N[0])
import tensorflow as tf
import tensorflow_probability as tfp
U = tfp.distributions.Uniform(0.0, 1.0)
...
def resampling(w, x):
bins = tf.cumsum(w/tf.reduce_sum(w))
u = (ind + U.sample(N))/N[0]
indx = np.digitize(u, bins) # <- this is my problem
return x[indx]
где w
- набор нормализованных весов, а x
- вектор состояний. И w
, и x
будут тензорами.
Суть моей проблемы в том, что я не могу найти какие-либо операции, которые позволили бы мне перебрать одно измерение тензора (в данном случае это будет shape = [1000, 1]
) и основаны на некоторых критериях, т.е. индекс бинов и, следовательно, X
(поскольку w
- это вектор весов X
) имеет вес, который для некоторой выборки из равномерного распределения равен <=
до некоторого значения в cdf := bins
.
редактировать дальнейшие разъяснения
Какие операции с тензорным потоком я могу использовать для замены np.digitize?
, который в основном перебирает массив, определенный в бинах (в формате cdf), и ищет значение, удовлетворяющее bins[i-1] <= x < bins[i]
, где i
- индекс значения.
Или другой способ решения этой проблемы - это выборка из U = tfp.distributions.Uniform(0.0, 1.0)
, взяв U.sample([1000, 1])
, затем итерируя по этим значениям, чтобы найти индекс i
, ближайший к этому значению в cdf (ячейки), то есть U[0, 0] >= min(bin[i])
для всех образцы от U
. Таким образом, я выбираю из наиболее вероятных значений (потому что w
- это мера вероятности) n = 1000 раз, следовательно, повторная выборка. Как перебрать тензор в функции потерь?
Я надеюсь, что объяснил себя достаточно ясно, но если вам нужны дополнительные разъяснения, пожалуйста, свяжитесь со мной, я бы очень хотел выяснить, как это сделать.