1. 程式人生 > 實用技巧 >Deep Learning with pytorch筆記(第三章)

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) \]

通過Size、storage offset和stride三個屬性

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()))

size 一個torch.Size物件,它儲存著一個指示每個維度上有多少個元素的列表。
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\)