Векторы стека различной длины в Tensorflow
Как я могу сложить векторы разной длины в тензорном потоке, например, из
[1, 3, 5]
[2, 3, 9, 1, 1]
[6, 2]
получить заполненную нулями матрицу
[1, 3, 5, 0, 0]
[2, 3, 9, 1, 1]
[6, 2, 0, 0, 0]
Число векторов известно во время определения, но их длины нет. Векторы создаются с использованием tf.where(condition)
1 ответ
Решение
Один из способов сделать это:
In [11]: v1 = [1, 3, 5]
In [12]: v2 = [2, 3, 9, 1, 1]
In [14]: v3 = [6, 2]
In [38]: max_len = max(len(v1), len(v2), len(v3))
In [39]: pad1 = [[0, max_len-len(v1)]]
In [40]: pad2 = [[0, max_len-len(v2)]]
In [41]: pad3 = [[0, max_len-len(v3)]]
# pads 0 to original vectors up to `max_len` length
In [42]: v1_padded = tf.pad(v1, pad1, mode='CONSTANT')
In [43]: v2_padded = tf.pad(v2, pad2, mode='CONSTANT')
In [44]: v3_padded = tf.pad(v3, pad3, mode='CONSTANT')
In [53]: res = tf.stack([v1_padded, v2_padded, v3_padded], axis=0)
In [56]: res.eval()
Out[56]:
array([[1, 3, 5, 0, 0],
[2, 3, 9, 1, 1],
[6, 2, 0, 0, 0]], dtype=int32)
Чтобы это работало с N
векторы, вы, вероятно, должны использовать for
цикл, чтобы подготовить pad
переменные для всех векторов и дополненных векторов впоследствии. И, наконец, использовать tf.stack
сложить эти дополняемые векторы вдоль 0
ая ось, чтобы получить желаемый результат.
PS: Вы можете получить длину векторов динамически, как только они получены из tf.where(condition)
,