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 захотят использовать Python Tensor.getitem или Variable.getitem, а не этот оператор напрямую.
Цель этого оператора — создать новый тензор с подмножеством элементов из 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 | A Tensor. |
begin | A Tensor. Должен быть одного из следующих типов: int32, int64. begin[k] задаёт смещение в k-й спецификации диапазона. Точное измерение, которому это соответствует, будет определено контекстом. Значения вне диапазона будут безмолвно ограничены. Если k-й бит begin_mask равен 1, тогда begin[k] игнорируется, и вместо этого используется полный диапазон соответствующего измерения. Отрицательные значения означают индексирование с самого высокого элемента, например, если foo==[1,2,3] то foo[-1]==3. |
end | A Tensor. Должен иметь тот же тип, что и begin. end[i] похож на begin, за исключением того, что end_mask используется для определения полных диапазонов. |
strides | A 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 равен 1 означает игнорирование значения начала и использование вместо этого наибольшего возможного интервала. Во время выполнения 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 равен 1 означает, что i-я позиция на самом деле является эллипсом. Не более одного бита может быть равен 1. Если ellipsis_mask == 0, то предоставляется неявная маска эллипса 1 << (m+1). Это означает, что foo[3:5] == foo[3:5, ...]. Эллипс неявно создаёт столько спецификаций диапазона, сколько необходимо для полного определения диапазона среза для каждого измерения. Например, для 4-мерного тензора foo срез foo[2, ..., 5:8] подразумевает foo[2, :, :, 5:8]. |
new_axis_mask | Необязательная int. По умолчанию 0. Маска битов, где бит i равен 1 означает, что 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 | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor. Имеет тот же тип, что и input. |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/raw_ops/StridedSlice