tf.nn.with_space_to_batch
| Просмотреть исходный код на GitHub |
Выполняет op над представлением «пространство в пакет» для input.
tf.nn.with_space_to_batch(
input,
dilation_rate,
padding,
op,
filter_shape=None,
spatial_dims=None,
data_format=None
)
Это приводит к преобразованию операций скользящего окна в соответствующую операцию «атров», в которой входные данные сэмплируются в указанной dilation_rate.
В особом случае, когда dilation_rate равномерно равно 1, это просто возвращает:
op(input, num_spatial_dims, padding)
В противном случае возвращается:
batch_to_space_nd( op(space_to_batch_nd(input, adjusted_dilation_rate, adjusted_paddings), num_spatial_dims, "VALID") adjusted_dilation_rate, adjusted_crops),
где:
adjusted_dilation_rate – это тензор int64 формы [max(spatialdims)], adjusted{paddings,crops} – это тензоры int64 формы [max(spatial_dims), 2]
определены следующим образом:
Сначала мы определяем два тензора int64 paddings и crops формы [num_spatial_dims, 2] на основе значения padding и пространственных размеров input:
Если padding = "VALID", то:
paddings, crops = required_space_to_batch_paddings( input_shape[spatial_dims], dilation_rate)
Если padding = "SAME", то:
dilated_filter_shape = filter_shape + (filter_shape - 1) * (dilation_rate - 1)
paddings, crops = required_space_to_batch_paddings( input_shape[spatial_dims], dilation_rate, [(dilated_filter_shape - 1) // 2, dilated_filter_shape - 1 - (dilated_filter_shape - 1) // 2])
Поскольку space_to_batch_nd и batch_to_space_nd предполагают, что пространственные размеры являются непрерывными, начиная со второго измерения, но указанные spatial_dims могут быть не такими, мы должны скорректировать dilation_rate, paddings и crops для их использования с этими операциями. Для данного измерения, если размер блока равен 1, и оба начальные и конечные значения заполнения и обрезки равны 0, то space_to_batch_nd фактически оставляет это измерение без изменений, что и требуется для измерений, не входящих в spatial_dims. Кроме того, space_to_batch_nd и batch_to_space_nd эффективно обрабатывают этот случай для любого количества ведущих и хвостовых измерений.
Для 0 <= i < len(spatial_dims), мы присваиваем:
adjusted_dilation_rate[spatial_dims[i] - 1] = dilation_rate[i] adjusted_paddings[spatial_dims[i] - 1, :] = paddings[i, :] adjusted_crops[spatial_dims[i] - 1, :] = crops[i, :]
Все неназначенные значения adjusted_dilation_rate по умолчанию равны 1, а все неназначенные значения adjusted_paddings и adjusted_crops по умолчанию равны 0.
Обратите внимание, что в случае, когда dilation_rate не равномерно равен 1, указание заполнения «VALID» эквивалентно указанию padding = "SAME" с формой фильтра [1]*N.
Расширенное использование. Обратите внимание на следующую оптимизацию: Последовательность операций with_space_to_batch с идентичными (не равномерно 1) параметрами dilation_rate и заполнением «VALID»
net = with_space_to_batch(net, dilation_rate, "VALID", op_1) ... net = with_space_to_batch(net, dilation_rate, "VALID", op_k)
может быть объединена в одну операцию with_space_to_batch следующим образом:
def combined_op(converted_input, num_spatial_dims, _): result = op_1(converted_input, num_spatial_dims, "VALID") ... result = op_k(result, num_spatial_dims, "VALID")
net = with_space_to_batch(net, dilation_rate, "VALID", combined_op)
Это устраняет накладные расходы k-1 вызовов space_to_batch_nd и batch_to_space_nd.
Аналогично, последовательность операций with_space_to_batch с идентичными (не равномерно 1) параметрами dilation_rate, заполнением «SAME» и нечетными размерами фильтра
net = with_space_to_batch(net, dilation_rate, "SAME", op_1, filter_shape_1) ... net = with_space_to_batch(net, dilation_rate, "SAME", op_k, filter_shape_k)
может быть объединена в одну операцию with_space_to_batch следующим образом:
def combined_op(converted_input, num_spatial_dims, _): result = op_1(converted_input, num_spatial_dims, "SAME") ... result = op_k(result, num_spatial_dims, "SAME")
net = with_space_to_batch(net, dilation_rate, "VALID", combined_op)
| Аргументы | |
|---|---|
input | Тензор ранга > max(spatial_dims). |
dilation_rate | int32 тензор известной формы [num_spatial_dims]. |
padding | константа str, равная "VALID" или "SAME" |
op | Функция, отображающая (input, num_spatial_dims, padding) -> output |
filter_shape | Если padding = "SAME", задает форму сверточного ядра/окна пулинга в виде целочисленного тензора формы [>=num_spatial_dims]. Если padding = "VALID", filter_shape игнорируется и не должен быть указан. |
spatial_dims | Монотонно возрастающая последовательность целочисленных значений num_spatial_dims (которые >= 1), определяющих пространственные размеры input и выходных данных. По умолчанию: range(1, num_spatial_dims+1). |
data_format | Строка или None. Указывает, является ли размерность канала input и выходных данных последней размерностью (по умолчанию, или если data_format не начинается с "NC"), или второй размерностью (если data_format начинается с "NC"). Для N=1 допустимыми значениями являются "NWC" (по умолчанию) и "NCW". Для N=2 допустимыми значениями являются "NHWC" (по умолчанию) и "NCHW". Для N=3 допустимыми значениями являются "NDHWC" (по умолчанию) и "NCDHW". |
| Возвращаемое значение | |
|---|---|
| Тензор выходных данных, как описано выше, размеры будут различаться в зависимости от предоставленной операции. |
| Исключения | |
|---|---|
ValueError | если padding недействительно или аргументы несовместимы. |
ValueError | если spatial_dims недействительны. |
© 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/versions/r2.9/api_docs/python/tf/nn/with_space_to_batch