У меня есть [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, ...]
, одна из них была бы отброшена.