tf.raw_ops.StridedSlice
Возвращает срез с шагом из input.
tf.raw_ops.StridedSlice(
input,
begin,
end,
strides,
begin_mask=0,
end_mask=0,
ellipsis_mask=0,
new_axis_mask=0,
shrink_axis_mask=0,
name=None
)
Обратите внимание: большинству пользователей Python следует использовать Tensor.getitem или Variable.getitem Python, а не эту операцию напрямую.
Цель этой операции — создать новый тензор, содержащий подмножество элементов из n-мерного тензора input. Подмножество выбирается с помощью последовательности разреженных спецификаций диапазонов m, закодированных в аргументах этой функции. Обратите внимание: в некоторых случаях m может быть равно n, но это необязательно. Каждая запись спецификации диапазона может быть одной из следующих:
Многоточие (...). Многоточия используются для обозначения нуля или более измерений с выбором полного диапазона и создаются с помощью
ellipsis_mask. Например,foo[...]— это срез, тождественный исходному тензору.Новая ось. Она используется для добавления нового измерения размера 1 и создаётся с помощью
new_axis_mask. Например,foo[:, ...], гдеfooимеет форму(3, 4), создаёт тензор(1, 3, 4).Диапазон
begin:end:stride. Он используется для указания того, сколько элементов выбрать из заданного измерения.strideможет быть любым целым числом, кроме 0.begin— целое число, обозначающее индекс первого выбираемого значения, аend— индекс последнего выбираемого значения. Число выбираемых значений в каждом измерении равноend - begin, еслиstride > 0, иbegin - end, еслиstride < 0.beginиendмогут быть отрицательными:-1— последний элемент,-2— предпоследний.begin_maskопределяет, следует ли заменять явно заданное значениеbeginнеявным эффективным значением0, еслиstride > 0, и-1, еслиstride < 0.end_maskдействует аналогично, но задаёт значение, необходимое для создания наибольшего открытого интервала. Например, для тензора формы(3,)foo[:]эффективные значенияbeginиendравны0и3. Не следует считать это эквивалентомfoo[0:-1], у которого эффективные значенияbeginиendравны0и2. Другой пример:foo[-2::-1]обращает порядок элементов в первом измерении тензора, отбрасывая последние два элемента в исходном порядке. Например,foo = [1,2,3,4]; foo[-2::-1]— это[4,3].Одиночный индекс. Он используется для сохранения только элементов с заданным индексом. Например, (
foo[2, :]для тензора формы(5,6)создаёт тензор формы(6,). Это кодируется вbegin,endиshrink_axis_mask.
Каждая концептуальная спецификация диапазона кодируется в аргументе операции. Чтобы лучше понять эту кодировку, рассмотрим нетривиальный пример. В частности, foo[1, 2:4, None, ..., :-3:-1, :] будет закодировано следующим образом:
begin = [1, 2, x, x, 0, x] # x denotes don't care (usually 0) end = [2, 4, x, x, -3, x] strides = [1, 1, x, x, -1, 1] begin_mask = 1<<4 | 1<<5 = 48 end_mask = 1<<5 = 32 ellipsis_mask = 1<<3 = 8 new_axis_mask = 1<<2 = 4 shrink_axis_mask = 1<<0 = 1
В этом случае, если foo.shape равен (5, 5, 5, 5, 5, 5), итоговая форма среза будет (2, 1, 5, 5, 2, 5). Рассмотрим последовательно каждую спецификацию аргумента.
Первый аргумент в примере среза преобразуется в
begin = 1иend = begin + 1 = 2. Чтобы отличить его от исходной спецификации2:4, мы также устанавливаем соответствующий бит вshrink_axis_mask.2:4задаёт значения 2, 4 и 1 для начала, конца и шага. Ни один из битов масок не устанавливается.None — это синоним
tf.newaxis. Это означает, что в итоговую форму добавляется измерение размера 1. Для начала, конца и шага задаются фиктивные значения, а бит new_axis_mask устанавливается....выбирает полные диапазоны для такого количества измерений, какое необходимо, чтобы задать срез для каждого измерения входной формы.:-3:-1демонстрирует использование отрицательных индексов. Отрицательный индексiдля измерения формыsпреобразуется в положительный индексs + i. Таким образом,-1становитсяs-1(то есть последним элементом). Это преобразование выполняется внутри системы, поэтому для начала, конца и шага задаются значения x, -3 и -1. Устанавливается соответствующий бит begin_mask, указывающий, что диапазон начинается с начала (значение x игнорируется).:указывает, что выбирается всё содержимое соответствующего измерения. Это эквивалентно::или0::1. Для начала, конца и шага задаются значения 0, 0 и 1 соответственно. Также устанавливаются соответствующие биты вbegin_maskиend_mask.
Требования: 0 != strides[i] for i in [0, m) ellipsis_mask must be a power of two (only one ellipsis)
| Аргументы | |
|---|---|
input | Объект Tensor. |
begin | Объект Tensor. Должен иметь один из следующих типов: int16, int32, int64. begin[k] задаёт смещение для спецификации диапазона номер k. Точное измерение, которому оно соответствует, определяется контекстом. Значения вне границ будут без предупреждения ограничены допустимым диапазоном. Если k-й бит в begin_mask установлен, то begin[k] игнорируется и вместо него используется полный диапазон соответствующего измерения. Отрицательные значения означают, что индексация начинается с наибольшего элемента. Например, если foo==[1,2,3], то foo[-1]==3. |
end | Объект Tensor. Должен иметь тот же тип, что и begin. end[i] аналогичен begin, за исключением того, что для определения полных диапазонов используется end_mask. |
strides | Объект Tensor. Должен иметь тот же тип, что и begin. strides[i] задаёт приращение в спецификации номер i после извлечения заданного элемента. Отрицательные индексы меняют исходный порядок на обратный. Значения вне диапазона ограничиваются значениями [0,dim[i]) if slice[i]>0 или [-1,dim[i]-1] if slice[i] < 0. |
begin_mask | Необязательный объект int. Значение по умолчанию — 0. Битовая маска, в которой установленный бит i означает, что начальное значение нужно игнорировать и вместо него использовать максимально возможный интервал. Во время выполнения begin[i] заменяется на [0, n-1), если stride[i] > 0, или на [-1, n-1], если stride[i] < 0. |
end_mask | Необязательный объект int. Значение по умолчанию — 0. Действует аналогично begin_mask. |
ellipsis_mask | Необязательный объект int. Значение по умолчанию — 0. Битовая маска, в которой установленный бит i означает, что позиция номер i является многоточием. Может быть установлен не более чем один бит. Если ellipsis_mask == 0, предоставляется неявная маска многоточия 1 << (m+1). Это означает, что foo[3:5] == foo[3:5, ...]. Многоточие неявно создаёт столько спецификаций диапазона, сколько необходимо для полного описания среза по каждому измерению. Например, для четырёхмерного тензора foo срез foo[2, ..., 5:8] подразумевает foo[2, :, :, 5:8]. |
new_axis_mask | Необязательный объект int. Значение по умолчанию — 0. Битовая маска, в которой установленный бит i означает, что спецификация номер i создаёт новое измерение формы 1. Например, foo[:4, tf.newaxis, :2] создаст тензор формы (4, 1, 2). |
shrink_axis_mask | Необязательный объект int. Значение по умолчанию — 0. Битовая маска, в которой бит i указывает, что спецификация номер i должна уменьшить число измерений. Начало и конец должны задавать срез размера 1 в этом измерении. Например, в Python можно использовать foo[:, 3, :], в результате чего значение shrink_axis_mask будет равно 2. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
Объект Tensor. Имеет тот же тип, что и input. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/raw_ops/StridedSlice