TensorFlow函数教程:tf.nn.with_space_to_batch
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无效。