Tensorflow собирать индексы и расширять - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть [batch, num_objs, vals] или (16, 4, 10) тензор y, в котором y[:,:,:2] имеет индексы (row, col) в [batch, rows, cols, num_objs, vals] или [16, 40, 60, 2, 10] тензор y'. Теперь каждый y[i,:,:2] может иметь одинаковые индексы (row, col) или все они могут быть уникальными. Я хочу отобразить все 10-мерные значения y на y' на основе индексов (row, col) из y[:,:,:2]. Я буду уменьшать размер num_objs с 4 до 2 и отбрасывать 1 или 2 вектора, если более 2 отображаются на одну и ту же ячейку сетки.

Благодаря этому ответу { ссылка } У меня есть тензор индекса на основе y[:,:,:2]. Вот что у меня есть

true_grid_coords = y[:,:,:2] // params.grid_stride
true_grid_vals = tf.concat([true_grid_coords, y[:,:,2:]], axis=2)
s1 = tf.shape(true_grid_coords, out_type=true_grid_coords.dtype)
b = tf.range(s1[0])
# Repeat batch index for each object
b = tf.repeat(b, s1[1]) # (64) 16 times num_obj
# Concatenate with row and column indices - (64, 1) concat (64, 2) = (64, 3), b is first col, true coords second, third col
# vals in first col(each batch index 0-15) repeated 4 times from repeat function
idx = tf.concat([tf.expand_dims(b, 1), tf.reshape(true_grid_coords, [-1, s1[2]])], axis=1)
s2 = tf.shape(y\')
# I want to index into first 3 dims of s2 and expand by adding (4, 10) tensor from indexing into y[:,:,:2]
true_grid_vals = tf.scatter_nd(idx, y, s2[:3])

Мне нужно использовать idx для индексации строк и столбцов в [batch, rows, cols, num_objs, vals] и строк, столбцов в y[:,:,:2] при извлечении всего вектора длины 10 (с). ) от y. Число векторов может быть match и будет между 0 и 4. Match может быть усечено или расширено до 2 (num_objs), и если совпадений нет или 1 соответствует, то другой вектор (ы) может быть всеми нулями , Затем добавьте (num_objs, 10) тензор к [batch, rows, cols, num_objs, vals] тензор y' в соответствующем (строка, столбец). Как я мог это сделать? Имеет ли это смысл?

Например, один образец i в партии y[i] будет тензор [4, 10] в форме

[1, 5, ....]
[30, 20, ....]
[37, 51, ....]
[37, 51, ....]

Эти первые 2 числа в каждом Строка может использоваться как указатель на первое и второе измерения тензора формы [16, 40, 60, 2, 10], называемого y'. Я хочу отобразить каждую строку выше в тензор [16, 40, 60, 2, 10] на основе первых 2 чисел в строках выше и соответствующего индекса партии i. В приведенном выше примере для пакета i 2 вектора будут отображаться на [i, 37, 51,:,:], один вектор на [i, 30, 20,0,:] и один на [i, 1, 5,0,:]. Каждое другое значение в y'[i,:,:,:,:] будет равно 0. Если бы было 3 строки выше с координатами [37, 51, ...], одна из них была бы отброшена.

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