#python #tensorflow2.x
#python #tensorflow2.x
Вопрос:
Я пытаюсь добавить значения некоторого неровного тензора к каждому значению другого тензора отдельно и получить в результате другой неровный тензор с еще одним измерением. Но я получаю сообщение об ошибке трансляции:
Unable to broadcast: dimension size mismatch in dimension=[2]. lengths=[3] dim_size=[1, 1, 1, 1, 1]
Таким образом, эта ошибка возникает вместо трансляции по неровному измерению размера 1, как указано в общем правиле трансляции tf.
Самый простой пример выглядит следующим образом:
Это работает (с ragged_rank=1
)
import tensorflow as tf
x = tf.ragged.constant(
[
[[1,2,3,4], [2,5,7,8]],
[[3,12,8,9],[0,0,1,1],[4,4,9,7]],
],
ragged_rank=1)
y = tf.constant([10, 20, 30])
x = x[:,:,tf.newaxis,:]
y = y[:,tf.newaxis]
print(x y)
Но это не так (с ragged_rank=2
)
import tensorflow as tf
x = tf.ragged.constant(
[
[[1,2,3,4], [2,5,7,8]],
[[3,12,8,9],[0,0,1,1],[4,4,9,7]],
],
ragged_rank=2)
y = tf.constant([10, 20, 30])
x = x[:,:,tf.newaxis,:]
y = y[:,tf.newaxis]
print(x y)
Мне приходится иметь дело с ragged_rank=2
r.t. потому что я получаю его как входные tf.data.Dataset
данные функции map моего пакетного конвейера.
Я также буду признателен за обходной путь уменьшения ragged_rank
до 1 (если это возможно), потому что внутреннее измерение должно быть равномерным (длиной 4)
UPD: Хорошо, мне удалось понизить рейтинг ragged_rank, воссоздав тензор следующим образом:
def downgrade_bbox_batch_ragged_rank(x, inner_len=5):
v = x.flat_values
rs = x.row_splits
return tf.RaggedTensor.from_row_splits(values=tf.reshape(v,(-1,inner_len)),
row_splits=rs)
После этого добавление новой оси непосредственно перед или во внутренних измерениях (flat_values) отлично работает в срок трансляции. Но добавление новой оси перед неровными измерениями все еще не работает. Это ожидаемое поведение?