Deep Learning with pytorch笔记

第三章3.7Tensor底层原理
真正管理存储这数据的内存区域的,是类Storage的实例,这个Storage的实例通过一个一维数组来存储数据。不管外在表现为多少维的数组,都是存储在一个一维数组中。而怎么让这个一维数组看起来像多维数组,就是Tensor完成的。
Storage类中有一个指针指向存储数据的一位数组,而Tensor通过对Storage进行封装,使得在外部看来数据是多维的。

那么如何得到tensor中的某个值在Storage的索引位置呢?

\[offset_{i,j} = stride[0]*i + stride[1]*j + storage\_offset \quad (1) \]

其中,\(i,j\)为该值在tensor中的索引,以二维tensor为例。

storage_offset 一个指向该Tensor元素开始的Storage索引,因为可能有些Tensor只使用了Storage的一部分,它控制着每个Tensor的起始位置,一般为0。
stride 一个元组,表示获取一个Storage中的一个元素需要在每个维度上跳过多少个元素。
比如下图:

stride=(3.1)storage_offset=0,根据方程(1),tensor中第2行第2列的值3在Storage中的索引: \(3*1+1*1 + 0=4\)

a = torch.tensor([[5, 7, 4], [1, 3, 2], [7, 3, 8]])
print(a)
print(a.storage())
print("size is {}".format(a.size()))
print("stride is {}".format(a.stride()))
print("storage offset is {}".format(a.storage_offset()))

第7章 torch.stack
torch.stack((a,b,c),dim=2)
在原始元素的shape中增加一个维度dim=2, 然后在新增的维度dim上进行叠加。它指定的是做完stack后的元素结果所在的那个维度

import torch
a = torch.IntTensor([[1,2,3],[11,12,33]])
b = torch.IntTensor([[4,5,6],[44,55,66]])
c = torch.stack((a,b),dim=2) # dim=0,dim=1
print(a)
print(b)
print(c)
tensor([[[ 1,  4],
         [ 2,  5],
         [ 3,  6]],

        [[11, 44],
         [12, 55],
         [33, 66]]], dtype=torch.int32)

原来a,b都为二维数据,现在增加了一个维度n=2。其中c[0][0] 为 a[0][0] 和 b[0][0] 这2个元素叠加构成的一个size为2的新的元素 [1,4]。因此c 的shape 为[2,3,2]。
问题在于c 的第三个维度,即dim=2,其维数怎么得到:有几tensor参与合并,其维数就为几。书中,对CIFAR10的50000张图片进行stack

imgs = torch.stack([img_t for img_t, _ in tensor_cifar10], dim=3)
imgs.shape # torch.Size([3, 32, 32, 50000])
posted @ 2020-07-13 17:44  木叶流云  阅读(475)  评论(0编辑  收藏  举报