阅读(8.9k) 书签 (0)

TensorFlow张量变换:tf.space_to_batch_nd函数

2018-01-29 11:06 更新

tf.space_to_batch_nd 函数

space_to_batch_nd(
    input,
    block_shape,
    paddings,
    name=None
)

参见指南:张量变换>分割和连接

用于 T 型的N维张量的 SpaceToBatch. 

此操作将输入的 "空间(spatial)" 维度 [1,..., M] 划分为一个形状 block_shape 块的网格,并将这些块与 "批" 维数 (0)交错,这样在输出中,空间维度[1,..., M] 对应于网格内的位置,并且批处理维度将空间块中的位置和原始批处理位置组合在一起.在划分成块之前, 输入的空间维度根据填充可选地是零填充的.请参见下面的详细描述.

函数参数

  • input:一个Tensor;是N维的并且具有形状input_shape = [batch] + spatial_shape + remaining_shape,其中spatial_shape有M维度.
  • block_shape:一个Tensor;必须是以下类型之一:int32,int64;1-D,并且具有形状[M],所有值必须>=1.
  • paddings:一个Tensor;必须是以下类型之一:int32,int64;二维,并且带有形状[M, 2],所有值必须>=0. paddings[i] = [pad_start, pad_end]为输入维度为i + 1指定填充,这对应于空间维度i.这需要block_shape[i]划分input_shape[i + 1] + pad_start + pad_end.该操作相当于以下步骤:
    1. 输入的维度为[1, ..., M]的零填充的起始和结束是根据paddings产生形状padded_shape的padded.
    2. 重塑padded到reshaped_padded形状:
      [batch] + [padded_shape[1] / block_shape[0], block_shape[0], ..., padded_shape[M] / block_shape[M-1], block_shape[M-1]] + remaining_shape            
    3. 排列reshaped_padded的维度以产生permuted_reshaped_padded的形状:
      block_shape + [batch] + [padded_shape[1] / block_shape[0], ..., padded_shape[M] / block_shape[M-1]] + remaining_shape
    4. 重塑permuted_reshaped_padded,将block_shape添加到batch维度中,产生形状的输出张量:
      [batch * prod(block_shape)] + [padded_shape[1] / block_shape[0], ..., padded_shape[M] / block_shape[M-1]] + remaining_shape                
    一些例子:
    (1)以下形状为[1, 2, 2, 1]的输入中,block_shape = [2, 2],并且paddings = [[0, 0], [0, 0]]:
    x = [[[[1], [2]], [[3], [4]]]]

    输出张量具有形状[4, 1, 1, 1]和值:

    [[[[1]]], [[[2]]], [[[3]]], [[[4]]]]

    (2)以下形状为[1, 2, 2, 3]的输入中,block_shape = [2, 2],并且paddings = [[0, 0], [0, 0]]:

    x = [[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]]

    输出张量具有形状[4, 1, 1, 3]和值:

    [[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]], [[10, 11, 12]]]

    (3)以下形状为[1, 4, 4, 1]的输入中,block_shape = [2, 2],并且paddings = [[0, 0], [0, 0]]:

    x = [[[[1], [2], [3], [4]], [[5], [6], [7], [8]], [[9], [10], [11], [12]], [[13], [14], [15], [16]]]]

    输出张量具有形状[4, 2, 2, 1]和值:

    x = [[[[1], [3]], [[9], [11]]], [[[2], [4]], [[10], [12]]], [[[5], [7]], [[13], [15]]], [[[6], [8]], [[14], [16]]]]

    (4)以下形状为[2, 2, 4, 1]的输入中,block_shape = [2, 2],并且paddings = [[0, 0], [2, 0]]:

    x = [[[[1], [2], [3], [4]], [[5], [6], [7], [8]]], [[[9], [10], [11], [12]], [[13], [14], [15], [16]]]]

    输出张量具有形状[8, 1, 3, 1]和值:

    x = [[[[0], [1], [3]]], [[[0], [9], [11]]], [[[0], [2], [4]]], [[[0], [10], [12]]], [[[0], [5], [7]]], [[[0], [13], [15]]], [[[0], [6], [8]]], [[[0], [14], [16]]]]

    除此之外,这个操作对于减少卷积成正则卷积非常有用,其中,name:操作的名称(可选).

函数返回

tf.space_to_batch_nd函数返回一个Tensor,它与input具有相同的类型.