阅读(4.4k) 书签 (0)

TensorFlow函数教程:tf.nn.with_space_to_batch

2019-02-14 14:54 更新

tf.nn.with_space_to_batch函数

tf.nn.with_space_to_batch(
    input,
    dilation_rate,
    padding,
    op,
    filter_shape=None,
    spatial_dims=None,
    data_format=None
)

定义在:tensorflow/python/ops/nn_ops.py。

对输入的space-to-batch表示执行操作。

这具有将滑动窗口操作转换为相应的“atrous”操作的效果,其中输入在指定的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张量,具有shape [max(spatialdims)],adjusted{paddings,crops}是int64张量,具有shape [max(spatial_dims), 2]

定义如下:

我们首先根据padding的值和input的空间维度定义两个int64张量paddings和crops,shape为[num_spatial_dims, 2]。

如果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,并且起始和结束padding和crop均为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, :]

adjust_dilation_rate的所有未分配值默认为1,而adjust_paddings和adjusted_crops的所有未分配值默认为0。

注意,在dilation_rate不均匀为1的情况下,指定“VALID”填充等同于指定padding = "SAME",其filter_shape为[1] * N。

高级用法。请注意以下优化:具有相同(非均匀1)dilation_rate参数和“VALID”填充的with_space_to_batch操作的序列。

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)

这消除了对space_to_batch_nd和batch_to_space_nd的k-1调用的开销。

类似地,具有相同(非均匀1)dilation_rate参数,“SAME”填充和奇数滤波器维度的with_space_to_batch操作系列。

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:映射(输入,num_spatial_dims,填充) - >输出的函数
  • filter_shape:如果padding =“SAME”,则将卷积内核/池窗口的形状指定为整数Tensor of shape [> = num_spatial_dims]。如果padding =“VALID”,则忽略filter_shape,无需指定。
  • spatial_dims:单调递增的num_spatial_dims 整数序列(> = 1),指定空间维度input 和输出。默认为:range(1, num_spatial_dims+1)。
  • data_format:字符串或无。指定input和输出的通道尺寸是最后一个尺寸(默认,或者data_format 不是以“NC”开头),还是第二个尺寸(如果data_format 以“NC”开头)。对于N = 1,有效值为“NWC”(默认)和“NCW”。对于N = 2,有效值是“NHWC”(默认)和“NCHW”。对于N = 3,有效值为“NDHWC”(默认)和“NCDHW”。

返回:

如上所述的输出张量,尺寸将根据提供的操作而变化。

可能引发的异常:

  • ValueError:if padding无效或参数不兼容。
  • ValueError:如果spatial_dims无效。