Deep learning 数据格式和步幅

Deep learning 数据格式和步幅,deep-learning,pytorch,Deep Learning,Pytorch,首先,什么是通道最后的格式?是NHWC吗 对于以下代码,如何计算步幅 import torch N, C, H, W = 10, 3, 32, 32 x = torch.empty(N, C, H, W) print(x.stride()) # Ouputs: (3072, 1024, 32, 1) 输出为30721024321 转换为通道最后一种格式时,此处如何计算步幅 x = x.contiguous(memory_format=torch.channels_last) print(x.s

首先,什么是通道最后的格式?是NHWC吗

对于以下代码,如何计算步幅

import torch
N, C, H, W = 10, 3, 32, 32
x = torch.empty(N, C, H, W)
print(x.stride()) # Ouputs: (3072, 1024, 32, 1)
输出为30721024321

转换为通道最后一种格式时,此处如何计算步幅

x = x.contiguous(memory_format=torch.channels_last)
print(x.shape) # Outputs: (10, 3, 32, 32) as dimensions order preserved
print(x.stride()) # Outputs: (3072, 1, 96, 3)
输出为火炬。尺寸[10,3,32,32] 3072,1,96,3

首先,什么是通道最后的格式?是NHWC吗

是的,此外,当您在PyTorch中从NCHW移动到NHWC时,基础内存将重新排序,步幅也会发生变化

对于以下代码,如何计算步幅

import torch
N, C, H, W = 10, 3, 32, 32
x = torch.empty(N, C, H, W)
print(x.stride()) # Ouputs: (3072, 1024, 32, 1)
numpy简介 stride定义要跳转到此轴中的下一个元素(代码段)所需的字节数:

import numpy as np

N, C, H, W = 10, 3, 32, 32
x = np.empty((N, C, H, W))
print(x.strides)  # Ouputs: (24576, 8192, 256, 8)
因此,要从元素[0,0,0,0]到元素[0,0,0,1],需要跳转8个字节,因为这是np.float64的大小。默认值是两倍。要从[0,0,0,x]跳到[0,0,1,x],需要遍历上一个维度中的所有元素,因此它是32*8=256。对于第二个维度,您必须遍历32*32*8=8192,要跳过N,您需要遍历32*32*8*3=24576字节

在皮托克 在Pytorch中,您不需要跨字节跳转,而是跨数组元素跳转,这比IMO更简单,并且独立于底层类型

在以通道作为第二维度的标准中,您需要跳转1个元素才能从[0,0,0,0]移动到[0,0,0,1],这是不言自明的,这是在W像素上的移动,32个元素才能在第二个到最后一个维度H中跳转,以此类推

在NHWC格式中,有3072、1、96、3表示N、C、H、W。这意味着跳1个元素跨通道移动,因为这是最后一个通道,跳3个元素跨W,跳3*32表示H,跳3*32表示N

首先,什么是通道最后的格式?是NHWC吗

是的,此外,当您在PyTorch中从NCHW移动到NHWC时,基础内存将重新排序,步幅也会发生变化

对于以下代码,如何计算步幅

import torch
N, C, H, W = 10, 3, 32, 32
x = torch.empty(N, C, H, W)
print(x.stride()) # Ouputs: (3072, 1024, 32, 1)
numpy简介 stride定义要跳转到此轴中的下一个元素(代码段)所需的字节数:

import numpy as np

N, C, H, W = 10, 3, 32, 32
x = np.empty((N, C, H, W))
print(x.strides)  # Ouputs: (24576, 8192, 256, 8)
因此,要从元素[0,0,0,0]到元素[0,0,0,1],需要跳转8个字节,因为这是np.float64的大小。默认值是两倍。要从[0,0,0,x]跳到[0,0,1,x],需要遍历上一个维度中的所有元素,因此它是32*8=256。对于第二个维度,您必须遍历32*32*8=8192,要跳过N,您需要遍历32*32*8*3=24576字节

在皮托克 在Pytorch中,您不需要跨字节跳转,而是跨数组元素跳转,这比IMO更简单,并且独立于底层类型

在以通道作为第二维度的标准中,您需要跳转1个元素才能从[0,0,0,0]移动到[0,0,0,1],这是不言自明的,这是在W像素上的移动,32个元素才能在第二个到最后一个维度H中跳转,以此类推

在NHWC格式中,N、C、H、W的值为3072、1、96、3。这意味着您跳过1个元素以跨通道移动,因为这是最后一个通道,3个元素以跨W、3*32跨H和3*32*32为N。TLDR:stride是存储中需要跳过的元素数,以获得每个维度上的下一个元素

我相信你指的是这个

因为每个张量都引用一个底层存储,所以可以有多个张量以不同的步幅和维度引用同一个存储

例如,我可能有一个3x3张量:

[1 2 4
 0 4 5
 7 8 0]
但所有这些数据实际上都存储在一维连续存储器中,即[1 2 4 0 4 5 8 0]。为了让张量知道它应该如何表示,即3x3,我们需要一个stride属性,它是存储中需要跳过的元素数,以获得每个维度上的下一个元素。这一步的步长为3,1,这意味着我需要跨过存储中的3个元素才能获得第一维度中的下一个元素,跨过1个元素才能获得第二维度中的下一个元素。例如

从1开始。要获取行维度中的下一个值,请按步幅添加3。所以存储中1之后的第三个元素是0。 另一个例子,让我们从2开始。要获得第二个维度列中的下一个值,请在存储器中添加1,这样就得到了4。 这是计算步幅的基础

回到你原来的问题

N、 C,H,W=10,3,32,32

要获得跨步,比如说N,假设N是第N个图像,那么我需要跳过32 x 32 x 3=3072个元素,以获得下一个图像的开始。因此,为什么在第一维度上步幅=3072102432,1。同样的逻辑也适用于其他步骤

从上面链接的教程中,channels last是一种将底层存储对象存储在内存中的不同方式,请参见链接中的pic。步幅的变化取决于连续内存的分配方式,但我们解释和理解步幅的方式保持不变。

TLDR:stride是数字o f存储中需要跳过以获取每个维度上的下一个元素的元素

我相信你指的是这个

因为每个张量都引用一个底层存储,所以可以有多个张量以不同的步幅和维度引用同一个存储

例如,我可能有一个3x3张量:

[1 2 4
 0 4 5
 7 8 0]
但所有这些数据实际上都存储在一维连续存储器中,即[1 2 4 0 4 5 8 0]。为了让张量知道它应该如何表示,即3x3,我们需要一个stride属性,它是存储中需要跳过的元素数,以获得每个维度上的下一个元素。这一步的步长为3,1,这意味着我需要跨过存储中的3个元素才能获得第一维度中的下一个元素,跨过1个元素才能获得第二维度中的下一个元素。例如

从1开始。要获取行维度中的下一个值,请按步幅添加3。所以存储中1之后的第三个元素是0。 另一个例子,让我们从2开始。要获得第二个维度列中的下一个值,请在存储器中添加1,这样就得到了4。 这是计算步幅的基础

回到你原来的问题

N、 C,H,W=10,3,32,32

要获得跨步,比如说N,假设N是第N个图像,那么我需要跳过32 x 32 x 3=3072个元素,以获得下一个图像的开始。因此,为什么在第一维度上步幅=3072102432,1。同样的逻辑也适用于其他步骤

从上面链接的教程中,channels last是一种将底层存储对象存储在内存中的不同方式,请参见链接中的pic。步幅的变化取决于连续内存的分配方式,但我们解释和理解步幅的方式保持不变