首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >卷积中的信道优先和信道最后

卷积中的信道优先和信道最后
EN

Stack Overflow用户
提问于 2021-08-03 02:50:12
回答 1查看 1.1K关注 0票数 2

我看到了两种类型的数据:第一频道和最后一频道在卷积网络的世界里。

根据许多网站的说法,“频道优先”指的是NCHW格式,而“最后频道”则相当于NHWC格式。这一点很明显,因为在通道优先格式中,C位于HW之前。然而,ARM似乎已经将“信道优先”定义为NHWC,正如您在本论文中所看到的那样。

P6:最常见的两种图像数据格式是信道宽度-高度(CHW),即信道的最后一种,以及高度-宽度-通道(HWC),即信道优先。尺寸顺序与数据步长相同。在HWC格式中,沿信道的数据以1的步长存储,沿宽度的数据以信道计数的步长存储,沿高度的数据以(信道计数×图像宽度)的步长存储。

这也是合理的,因为“频道第一”听起来像是MAC操作按频道进行,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (N){
  for (H){
    for (W){
      for (C){
      }
    }
  }
}

所以对频道没有固定的定义--第一频道还是最后频道,不是吗?

另外,我不确定当你说NHWCNCHW时,你具体指的是什么?我想重要的是算法和内存中的数据排列的结合。如果数据以NHWC格式输入,则需要像这样设计算法。

而且,由于NHWCNCHW没有固定的定义,我认为如果只说PyTorch是NCHW、通道优先或其他什么,而不提及数据是如何在内存中排列的话,那就没有任何意义了。

或者当你听到NCHW时,你会意识到内存中的数据排列类似于ch0[0,0]ch1[0, 0]ch2[0, 0]ch0[1, 0]ch1[1, 0]ch2[1, 0]ch0[2, 0],.?

有人能帮我澄清我对数据格式的理解吗?

EN

回答 1

Stack Overflow用户

发布于 2021-08-03 03:15:16

我最初忽略了你所链接的一份文件,它们清楚地定义了两个反对者是如何在文档和其他地方使用这些术语的。对于CHWHWC,确实有两种不同的看法.

TLDR;对于终端用户,CHW是频道优先,HWC是最后通道.在这种情况下,我们指的是通道维度相对于其他维度(HW)的位置。无论是在CHW之前还是在HWC之后,都是由所使用的图书馆定义的一个惯例问题(例如。PyTorch对Tensorflow)。在内存分配方面,将CHW信道称为最后一条是有意义的,这意味着通道轴的步长将是最后的:它将在相对于张量的其他轴上最后展开。

如果您只说PyTorch是NCHW、通道优先或其他什么,而不提及数据在内存中的排列方式,我认为这是没有任何意义的。

对于最终用户(如终端开发人员),内存的分配或安排方式并不重要。重要的是要知道如何使用PyTorch提供的API来操作torch.Tensors,当我们说NCHW时,我们指的是‘通道优先’,即形状(batch_size, channel, height, width)的张量。在所有PyTorch文档页中,您将找到所需的形状、输入和输出张量。这只是碰巧,他们选择坚持NCHW公约的二维通道张量。

坚持一种格式是有意义的,让它适用于底层实现--在内存安排确实重要的地方--或者最终用户本身--他们习惯于使用单一格式。

例如,在TensorFlow中,通道是最后一个,所以使用的格式是NHWC

让我们回到HWC (resp. )CHW)被命名为频道优先(resp )。在你链接的那份报纸上。这与张量步幅有关:即内存中数据的布局。直观地说,您可以认为格式HWC是通道优先,因为通道维度是展开的第一个轴。

如果您查看这个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> x = torch.rand(2,3,4) # last dimension is the channel axis
tensor([[[0.5567, 0.0276, 0.6491, 0.7933],
         [0.2876, 0.0361, 0.3883, 0.3201],
         [0.6742, 0.0305, 0.5719, 0.4683]],

        [[0.3385, 0.2082, 0.1675, 0.3429],
         [0.6146, 0.0533, 0.6147, 0.2216],
         [0.1855, 0.6107, 0.1716, 0.0071]]])

实际上,当数据扁平时(假设初始张量的数据在内存中是连续的),实际上显示了潜在的内存数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> x.flatten()
tensor([0.5567, 0.0276, 0.6491, 0.7933, 0.2876, 0.0361, 0.3883, 0.3201, 0.6742,
        0.0305, 0.5719, 0.4683, 0.3385, 0.2082, 0.1675, 0.3429, 0.6146, 0.0533,
        0.6147, 0.2216, 0.1855, 0.6107, 0.1716, 0.0071])

注意上面的数据是如何布置的:按通道0.5567, 0.0276, 0.6491, 0.7933,然后是0.2876, 0.0361, 0.3883, 0.3201,等等.

在另一种格式(即CHW)中,它将被设置为0.5567, 0.2876, 0.6742,然后是0.3385, 0.6146, 0.1855,等等。

因此,在引用内存中如何分配数据时,调用CHW通道-最后(HWC为通道-优先)是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68634724

复制
相关文章
根据用户输入的行数,打印出相应行数的直角三角形
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>输出指定行数的* 形成直角三角形</title> </head> <body> <script> // 输出指定行数的* ,形成直角三角形 var row = prompt("请输入需要打印的行数"); for (var i = 1; i <= row; i++) { for (var j = 1; j <= i; j++) {
是阿超
2021/10/15
8530
JS根据列表排列对象数组
] const sortInfo = ['f','c','b'] nodeData_.sort((a, b) => {
小仙女闯运维
2020/09/23
4.5K0
根据rpt文件打印报表
不用一个个地导入rpt文件,再去写固定的代码,而是每次动态的根据指定的名称去加载报表和打印   if(Session["PrintXml"]!=null)    {     ReportDocument rd=new ReportDocument();     rd.Load (this.Server.MapPath("\\Flow\\FlowForm\\rpt")+"\\"+Session["PrintFormName"]+".rpt");     rd.SetDataSource(XmlPage.Get
用户1075292
2018/01/23
1.3K0
WEB打印-根据需求打印局部源码记录
这次的需求可能就比较简单了,就是实现web端的打印,但是是根据需求打印,而不是直接打印全部
何处锦绣不灰堆
2020/05/29
8500
WEB打印-根据需求打印局部源码记录
用户输入
大多数程序都在解决最终用户问题,为此通常需要从用户那里获取一些信息。在程序需要一个名字时,你需要提示用户输入该名字;程序需要一个名字时,你需要提示用户输入一系列名字。
狼啸风云
2019/01/18
9700
扫码打印新的实现方法(打印时输入)
打印时输入的是Label mx 条码软件的文字、条码、二维码共有属性,实现扫描一个条码,打印一个新标签,常用于重新贴码的包装箱或产品贴。下图为文字、条码、二维码的“打印时输入”属性设置:
用户6708611
2023/07/05
4680
扫码打印新的实现方法(打印时输入)
SAP 根据PO查找对应的打印FORM
正文部分 1、TCODE:NACE进入 找到 输出控制条件对应的应用程序名字,如下图: 2、选中应用程序后,点击上面菜单里的输出类型,如下图
matinal
2020/11/27
7620
Vue根据数据字段大小进行排列
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script type="text/javascript" src="http://cdn.suol
明知山
2020/09/03
8370
打印不重复的字符串全排列(递归)
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 
砖业洋__
2023/05/06
3970
打印不重复的字符串全排列(递归)
Dynamic ReLU:根据输入动态确定的ReLU
这是我最近才看到的一篇论文,它提出了动态ReLU (Dynamic ReLU, DY-ReLU),可以将全局上下文编码为超函数,并相应地调整分段线性激活函数。与传统的ReLU相比,DY-ReLU的额外计算成本可以忽略不计,但表示能力明显增强,并且实现简单,所以可以非常简单的对我们现有的模型进行修改。
deephub
2023/08/30
1850
Dynamic ReLU:根据输入动态确定的ReLU
java 输出字符串的所有排列_Java程序打印字符串的所有排列
static void print_permutations(String my_str,String my_ans){
用户7886150
2021/04/29
1.1K0
Angular 2 用户输入
等号左边的 (click) 表示把该按钮的点击事件作为绑定目标 。 等号右边,引号中的文本是一个 模板语句
陈不成i
2021/07/26
1.7K0
Python之用户输入
大多数程序都旨在解决最终用户的问题,为此,需要从用户那里获取一些信息。函数input()让程序暂停运行,等待用户输入一些文本。
py3study
2020/01/06
1.2K0
python 接收用户的输入
None是一个特殊的常量。 None和False不同。 None不是0。 None不是空字符串。 None和任何其他的数据类型比较永远返回False。 None有自己的数据类型NoneType。 你可以将None复制给任何变量,但是你不能创建其他NoneType对象。
py3study
2020/01/09
2K0
python 接收用户的输入
输入数字n然后输出0到n的全排列
给定一个正整数n, 则输出0到n的所有排列 输入:2 输出:012 021 102 120 201 210 代码: private static Set<String> result = new HashSet<String>(); public static void allSort(int number) { if (number < 0) { return; } String str=""; for (int i = 0;i <= number; i
用户6055494
2019/10/21
1.1K0
python用户输入(三)
name = "Li QW" #定义变量 fname = name  #fname等于name变量产生的值 print("My name is " , name,fname) name = "study"
py3study
2020/01/13
1K0
android adb logcat 根据包名打印日志
android根据包名打印日志 Linux or Mac: adb logcat | grep -F "`adb shell ps | grep com.abc.package | cut -c10-15`" windows: adb logcat | findstr com.abc.package adb logcat -v time | find “XXX” >D:\myLog2.txt "XXX"可以用包名,或者关键字去代替。
tea9
2022/07/16
2.2K0
Shell - 根据用户名查询该用户的相关信息
小小工匠
2023/09/01
1750
Shell - 根据用户名查询该用户的相关信息
点击加载更多

相似问题

根据用户输入的数字重新排列文本输入字段

20

如何根据用户输入打印if语句?

30

根据用户输入打印回算

24

根据用户输入打印不同的句子

20

根据用户的输入,打印正确的事件

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文