阅读(4947) (12)

TensorFlow:tf.space_to_depth函数

2018-01-29 10:40:04 更新

tf.space_to_depth 函数

space_to_depth(
    input,
    block_size,
    name=None,
    data_format='NHWC'
)

定义在:tensorflow/python/ops/array_ops.py.

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

T型张量的SpaceToDepth.

重新排列空间数据块,进入深度.更具体地说,该操作会输出输入张量的副本,其中来自维height和width维的值将移至该depth维.attr block_size表示输入块大小.

  • 不重叠的block_size乘block size大小的块,在每个位置重新排列成深度.
  • 输出张量的深度是block_size * block_size * input_depth.
  • 输入的每个块内的Y、X坐标成为输出通道索引的高阶分量.
  • 输入张量的高度和宽度必须能被block_size整除.

data_formatATTR用以下选项指定输入和输出张量的布局:“NHWC”:[ batch, height, width, channels ];“NCHW”:[ batch, channels, height, width ];“NCHW_VECT_C”:qint8 [ batch, channels / 4, height, width, channels % 4 ]

将操作视为转换6维张量是有用的.例如,对于data_format = NHWC,可以通过6个坐标指定输入张量中的每个元素,按照减小的存储器布局重要性排序为:n,oY,bY,oX,bX,iC(其中n =批索引,oX,oY表示X或输出图像中的Y坐标,bX,bY表示输入块内的坐标,iC表示输入通道).输出将是以下布局的转置:n,oY,oX,bY,bX,iC

这个操作对调整卷积之间的激活(但保留所有数据)是有用的,例如,而不是池.这对纯粹卷积模型的训练也很有用.

例如,给定一个形状的输入[1, 2, 2, 1],data_format =“NHWC”和block_size = 2:

x = [[[[1], [2]],
      [[3], [4]]]]

这个操作会输出一个形状为[1, 1, 1, 4]的张量:

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

在这里,输入的批量为1,每个批量元素都有形状[2, 2, 1],相应的输出将有一个单一的元素(即宽度和高度均为1),并且将具有4个通道(1 * block_size * block_size)的深度.输出元素的形状是[1, 1, 4].

对于一个深度较大的输入张量,这里的形状[1, 2, 2, 3],例如:

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

这个操作,对于2的block_size,将返回下面的形状为[1, 1, 1, 12]的张量:

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

同样,对于以下输入的形状[1 4 4 1],块大小为2:

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

操作将返回下面形状为[1 2 2 4]的张量:

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

函数参数

  • input:一个Tensor.
  • block_size:一个>=2的int,表示空间块的大小.
  • data_format:可选的string,来自:"NHWC", "NCHW", "NCHW_VECT_C";默认为"NHWC".
  • name:操作的名称(可选).

函数返回

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