Обрезать тензор переменной длины до максимальной длины - PullRequest
0 голосов
/ 22 февраля 2020

Наличие двумерного тензора с одним фиксированным измерением и одним измерением переменной длины: как я могу ограничить измерение переменной длины максимальной длиной? Если переменная длина короче, то максимум должен быть сохранен (, а не дополнен ), но если он длиннее, он должен просто обрезать конец.

Например, предположим, что все тензоры имеют форму (None, 4), и я хочу ограничить их все максимальной формой (3, 4). Один пример ввода может быть:

tensor1 = tf.constant([
    [1, 2, 0, 0],
    [1, 3, 4, 0],
    [0, 0, 0, 0],
    [7, 7, 7, 7],
    [7, 8, 9, 1],
], dtype=tf.int32)

..., который должен быть обрезан до:

tensor1_trimmed = tf.constant([
    [1, 2, 0, 0],
    [1, 3, 4, 0],
    [0, 0, 0, 0],
], dtype=tf.int32)

Однако все, что меньше максимума, должно остаться без изменений:

tensor2 = tf.constant([
    [9, 9, 9, 9],
    [9, 9, 9, 9],
], dtype=tf.int32)

... должен оставаться точно таким же:

tensor2_trimmed = tf.constant([
    [9, 9, 9, 9],
    [9, 9, 9, 9],
], dtype=tf.int32)

Есть ли встроенная команда для этого? Или как бы вы этого добились?

1 Ответ

1 голос
/ 22 февраля 2020

tf.strided_slice поддерживает нарезку в стиле numpy, поэтому вы можете использовать [:3,:] в вашем примере

>>> tensor1 = tf.constant([
...     [1, 2, 0, 0],
...     [1, 3, 4, 0],
...     [0, 0, 0, 0],
...     [7, 7, 7, 7],
...     [7, 8, 9, 1],
... ], dtype=tf.int32)
>>> tensor1[:3,:]
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[1, 2, 0, 0],
       [1, 3, 4, 0],
       [0, 0, 0, 0]], dtype=int32)>
>>> tensor2 = tf.constant([
...     [9, 9, 9, 9],
...     [9, 9, 9, 9],
... ], dtype=tf.int32)
>>> tensor2[:3,:]
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
array([[9, 9, 9, 9],
       [9, 9, 9, 9]], dtype=int32)>
...