图解TensorFlow op:tf.nn.depth_to_space

2024-04-01 03:58

本文主要是介绍图解TensorFlow op:tf.nn.depth_to_space,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

田海立@CSDN 2020-10-20

TensorFlow算子depth_to_space的官方说明文档写得很简单,从中获取不到真正的执行方式,对于复杂的情况也就无从得知运算结果。本文用图文的方式来解释该算子运算的方式。

 

零、基础知识

阅读本文,你需要知道下列基本知识,可以从笔者之前的博文中了解:

《数据的NCHW/NHWC排布方式》

    用到数据的NHWC摆放顺序

《Tensor Reshape操作》

    用到Reshape操作,以及Reshape操作不改变数据的摆放原则。

 

一、depth_to_space原型

depth_to_space是把depth维的数据移到space上,与space_to_depth刚好是反向的操作。对应到ML系统里Tensor的NHWC/NCHW数据:depth对应Channel;space对应Height和Width。而且该操作是把depth上的数据分给Height以及Width上。所以,对应有一个参数block_size,要求原Tensor的depth是block_size的block_size^2倍

这样,新的Tensor

  • Width是 input_width x block_size;
  • Height是 input_height x block_size;
  • Depth是input_depth / (block_size * block_size)

原型如下:

tf.nn.depth_to_space(input, block_size, data_format='NHWC', name=None
)

因为这里严格区分了C与H/W各维度,如果数据格式不是NHWC时,需要指定data_format。

 

二、depth_to_space举例

怎么执行的呢?官方举了三个很简单的例子,因为第一个更简单,已经包含在第二个里,这里列出两个。

1. [1,1,1,12] -> [1, 2, 2, 3]

程序实现如下:

直观上看,上面程序的[1,1,1,12] -> [1, 2, 2, 3]的depth_to_space操作如下:

 

2. [1, 2, 2, 4] -> [1,4,4,1]

程序实现如下:

 

直观上看,上面程序的[1,2,2,4] -> [1, 4, 4, 1]的depth_to_space操作如下:

 

3. 分析

depth_to_space执行时维度的变化很容易理解:Width是 input_width x block_size;Height是 input_height x block_size;Depth是input_depth / (block_size * block_size)。

但是数据怎么移动的呢?

第一个例子是把源Tensor的一个Channel上的数据按照Channel -> Width -> Height的顺序在目标tensor上重新摆放。那为什么不是别的顺序摆放呢?

第二个例子:

  • 先把源Tensor上的一个Channel上的数据按照Width -> Height在目标Tensor顺序排放;
  • 然后再在源Tensor的Width方向上选择下一个Channel,同样数据按照Width -> Height在目标Tensor顺序排放;
  • 再源Tensor的Height方向上选择Channel,同样数据按照Width -> Height在目标Tensor顺序排放。

为什么不是一个Channel上取数据,然后直接把[1, 2, 3, 4]就放在一行上?这到底是什么规律?

如果两个例子结合起来,也就是Channel更深(操作后Channel仍大于1),原Width与Height也都大于1,结果怎样?

 

三、复杂情况[1, 2, 3, 12]

我们就看更复杂的情况:

该Tensor也就是这样的:

 

执行,之后:

 

四、depth_to_space对数据的处理

depth_to_space数据排布理解起来就是把按Channel处理,把Channel的数据重新排布。这里会牵涉:

  • 原Channel的选择顺序:NHWC格式已经选择了Channel了,接下来当然就是Width方向了,然后是Height方向。
  • 数据在新的目标Tensor上怎么摆放的?无论NHWC还是NCHW格式,存储数据都是要以1-D存放。这里的数据已经是1-D的,也就是把这数据放到NHWC的空间上,而shape改变了。这不就是reshape的操作吗。

所以,depth_to_space操作对数据的处理就是:

  1. 按照Width -> Height的顺序选择Channel;
  2. 对一个Channel里的数据,用reshape操作改变为[in_batch, block_size, block_size, in_channel / (block_size*block_size)]
  3. 对reshape之后的数据,按照Width -> Height的顺序再拼起来。

最后的Tensor的shape也就是[in_batch, in_height * block_size, in_width * block_size, in_channel / (block_size*block_size)]

 

上述的处理过程,用图展示就是这样的:

depth_to_space operation procedure

 

总结

本文分析了tf.nn.depth_to_space对Tensor的处理。维度上做变换;数据上按Channel取数据,然后做reshape,再拼接在一起。

 

【其他相关话题】

space_to_depth是这一过程的逆过程,可参考《图解TensorFlow op:space_to_depth》。

data_format也可以指定为其他格式,比如NCHW,也请自行分析,这里不再赘述。

 

这篇关于图解TensorFlow op:tf.nn.depth_to_space的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866153

相关文章

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

图解可观测Metrics, tracing, and logging

最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过,也是去年后半年到现在一直在做和研究的东西。从去年的关于Metrics的goappmonitor,到今年在排查问题时脑洞的基于log全链路(Tracing)追踪系统的设计,正好是对这三个话题的实践。这不禁让我对它们的关系进行思考:Metrics和Loggi

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 ##一、 缘由及解决方法 把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用

win10不用anaconda安装tensorflow-cpu并导入pycharm

记录一下防止忘了 一、前提:已经安装了python3.6.4,想用tensorflow的包 二、在pycharm中File-Settings-Project Interpreter点“+”号导入很慢,所以直接在cmd中使用 pip install -i https://mirrors.aliyun.com/pypi/simple tensorflow-cpu下载好,默认下载的tensorflow

pytorch torch.nn.functional.one_hot函数介绍

torch.nn.functional.one_hot 是 PyTorch 中用于生成独热编码(one-hot encoding)张量的函数。独热编码是一种常用的编码方式,特别适用于分类任务或对离散的类别标签进行处理。该函数将整数张量的每个元素转换为一个独热向量。 函数签名 torch.nn.functional.one_hot(tensor, num_classes=-1) 参数 t

torch.nn 与 torch.nn.functional的区别?

区别 PyTorch中torch.nn与torch.nn.functional的区别是:1.继承方式不同;2.可训练参数不同;3.实现方式不同;4.调用方式不同。 1.继承方式不同 torch.nn 中的模块大多数是通过继承torch.nn.Module 类来实现的,这些模块都是Python 类,需要进行实例化才能使用。而torch.nn.functional 中的函数是直接调用的,无需

稀疏自编码器tensorflow

自编码器是一种无监督机器学习算法,通过计算自编码的输出与原输入的误差,不断调节自编码器的参数,最终训练出模型。自编码器可以用于压缩输入信息,提取有用的输入特征。如,[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]四比特信息可以压缩成两位,[0,0],[1,0],[1,1],[0,1]。此时,自编码器的中间层的神经元个数为2。但是,有时中间隐藏层的神经元

Tensorflow实现与门感知机

感知机是最简单的神经网络,通过输入,进行加权处理,经过刺激函数,得到输出。通过输出计算误差,调整权重,最终,得到合适的加权函数。 今天,我通过tensorflow实现简单的感知机。 首先,初始化变量:     num_nodes = 2     output_units = 1     w = tf.Variable(tf.truncated_normal([num_nodes,output