作者:咖啡色的午后_905 | 来源:互联网 | 2023-09-12 19:47
田海立@CSDN2020-10-20TensorFlow算子space_to_depth是depth_to_space的逆操作。本文用图文的方式来解释该算子运算的方式。一、spac
田海立@CSDN 2020-10-20
TensorFlow算子space_to_depth是depth_to_space的逆操作。本文用图文的方式来解释该算子运算的方式。
一、space_to_depth原型
space_to_depth是把space数据(width和height维)移到depth(Channel)维上,与depth_to_space刚好是反向的操作。对应到ML该操作是把width和height维上各取block_size都分给depth上。所以,对应有一个参数block_size,要求原Tensor的height和width都是block_size的整数倍。
这样,新的Tensor
- Width是 input_width / block_size;
- Height是 input_height / block_size;
- Depth是input_depth * block_size * block_size
原型如下:
tf.nn.space_to_depth(
input, block_size, data_format='NHWC', name=None
)
因为这里严格区分了C与H/W各维度,如果数据格式不是NHWC时,需要指定data_format。
二、space_to_depth程序实现
以[1, 6, 4, 3] space_to_depth(block_size = 2)为例:
执行space_to_depth(block_size = 2)之后:
三、space_to_depth对数据的处理
space_to_depth操作对数据的处理就是:
- 选取[in_batch, block_size, block_size, in_depth]为一个Tensor;
- 对Step#1里的Tensor做reshape操作改变为[in_batch, 1, 1, in_channel * block_size * block_size];
- 按照先Width方向再Height方向的顺序同Step#1一样选择Tensor;
- 对Step#3里的Tensor同Step#3一样做reshape操作;
- 把Step#4和Step#4里得到的新Tensor拼接起来。
最后的Tensor的shape也就是[in_batch, in_height / block_size, in_width / block_size, in_channel * (block_size*block_size)]
上述的处理过程,一张图展示就是这样:
总结
本文分析了tf.nn.space_to_depth对Tensor的处理。维度上做变换;数据上把height和width的block_size*block_size数据做reshape,也就实现了depth上的扩充,然后再整体拼接在一起。
【其他相关话题】
depth_to_space是这一过程的逆过程,参看《图解TensorFlow op:tf.nn.depth_to_space》。
data_format也可以指定为其他格式,比如NCHW,也请自行分析,这里不再赘述。