張量基本概念:
張量其實就是tensor,和tensorflow里的基礎數據結構相同,本質就是N維數組;
張量的提出本質是為了優化底層數學計算速度;
C++和python這種解釋型語言相比之所以有優越性,本質就是因為所有類似於內置類型的數值都是采用連續內存直接存儲;
而python則是以對象類型進行存儲,存儲都需要大量的空間,更別說數值計算;
因此,tensor主要目的就是模擬類C的底層存儲計算;
對於pytorch中張量的基礎形式如下所示:
當然,對於多維數組,可以有如下形式,以tensor為初始化函數單位,python多維列表進行初始化;
張量的存儲方式:
張量主要由tensor.Storage來進行存儲管理,但是無論是幾維數組,都會映射到一維情況;
按照書上的論述,是按照逐行-逐列展開為一維;
但是感覺知道這個沒啥卵用,因為一般不直接修改,知道就行;
張量的尺寸、存儲偏移和步長:
尺寸:相當於numpy中的shape,指出該數據結構中的尺寸大小,類似於m*n矩陣;
步長:為了獲得每個維度下的元素需要跳過的元素數量;
偏移:存儲中與張量中第一個元素相對應的索引;
通俗理解:
由於tensor在內存中以一維數組形式存儲,所以必須要記錄矩陣信息,;
尺寸、偏移、步長就是作為存儲信息進行數據定位為目標存在的;
不同維度的張量也是根據三者來計算索引;
如果對一個矩陣進行轉置,修改的也是這三個信息,並不影響storage中的存儲形式;
如下圖所示:
為了方便數值計算,常常采用contiguous方法來把轉置后的非連續張量stroage轉化為連續;
從上述可以基本看出contiguous的基本用法,即將一個非連續storage可以轉換為一個連續的storage;
關於tensor的數據類型:
基礎的tensor類型如下所示:
tensor中可以指定數據類型,可以在tensor初始化值列表中使用dtype進行指定;
對於類型轉換可以直接采用to函數或者type函數,或者直接調用.double()等進行轉換;
這里不再贅述;
索引張量:
類似於python中list的切片,主要針對與tensor維度進行處理:
points[1:] # 第1行及之后所有行,(默認)所有列 points[1:, :] # 第1行及之后所有行,所有列 points[1:, 0] # 第1行及之后所有行,僅第0列
如上所示;
Tensor和Numpy的相互轉換:
tensor張量和numpy數組可以進行無縫銜接;
由於兩者可以根據緩沖協議進行轉換:
如果想從tensor變為numpy,直接采用.numpy()即可;
同理,如果想從numpy轉化為tensor,直接調用.from_numpy(numpy)即可;
序列化張量:
序列化張量即張量的存儲;
可以使用torch自帶的open()和load()函數進行張良的存儲,缺點是無法使得其他軟件進行讀取;
也可以使用HDF5庫和格式來進行存儲;
import h5py f = h5py.File('../../data/chapter2/ourpoints.hdf5', 'w') dset = f.create_dataset('coords', data=points.numpy()) f.close()
f = h5py.File('../../data/chapter2/ourpoints.hdf5', 'r') dset = f['coords'] last_points = dset[1:]
當然也可以根據切片來進行訪問,如上所示;
書中本章節僅僅作為入門,詳細仍然需要參觀https://pytorch-cn.readthedocs.io/zh/latest/;