С тензорным потоком у меня есть такие тензоры строк, как
[
[0, 1, 2],
[1, 2, 3],
[4, 5, 6]
]
и у меня есть список, по которому я хочу повторить строки выше,
[ 3, 2, 1 ]
В результате хочу
[
[0, 1, 2],
[0, 1, 2],
[0, 1, 2],
[1, 2, 3],
[1, 2, 3],
[4, 5, 6]
]
что значит
Хочу [0, 1, 2]
трижды,
[1, 2, 3]
дважды,
[4, 5, 6]
только один раз, следуя [3, 2, 1]
(это мой второй аргумент).
Это не проблема, если к этому относиться как к процедуре.
Предлагаемый «дублированный» вопрос имеет смысл. Идея ответа также была вдохновляющей. Но я думаю, что есть необходимость обобщить случай, объединить и объединить разрозненные решения в одно. Позвольте мне добавить некоторые решения, которые я нашел.
Это хороший ответ.
Я нашел еще одну подсказку из дерева вкладов тензорного потока
которые повторяют список диапазона ([0,...,n]) скаляров до своего времени. от 0 до 0 раз 1 к 1 раз от 2 до 2 раз ... от n до n раз
который выглядит слишком ограниченным, чтобы использовать его сам с собой.
Но while_loop
из control_flow_ops
выглядит очень полезным.
with ops.name_scope(name, 'repeat_range', [counts]) as scope:
counts = ops.convert_to_tensor(counts, name='counts')
def cond(unused_output, i):
return i < size
def body(output, i):
value = array_ops.fill(counts[i:i+1], i)
return (output.write(i, value), i + 1)
size = array_ops.shape(counts)[0]
init_output_array = tensor_array_ops.TensorArray(
dtype=dtypes.int32, size=size, infer_shape=False)
output_array, num_writes = control_flow_ops.while_loop(
cond, body, loop_vars=[init_output_array, 0])
return control_flow_ops.cond(
num_writes > 0,
output_array.concat,
lambda: array_ops.zeros(shape=[0], dtype=dtypes.int32),
name=scope)
Поэтому я обмениваю array_ops.fill
на body
с
tile_repeats = tf.concat([[counts[i]], tf.ones([tf.rank(rows) - 1],
dtype=tf.int32)], axis=0)
value = tf.tile(tf.expand_dims(rows[i], 0), tile_repeats)
И это сработало.
Возможный дубликат Повтор Tensorflow numpy