2020-03-07

從零開始深度學習Pytorch筆記——張量的創建(上)

我們首先要聊到他的基本數據類型——張量(Tensor),那張量到底是什麼呢?張量類似於Numpy中的ndarray,我們都知道深度學習的基礎是神經網絡結構,而在Pytorch中,張量是構建神經網絡的基礎。比較重要的一點是張量可以在GPU上進行計算。所以從本質上來說,PyTorch 是一個處理張量的庫。一個張量是一個數字、向量、矩陣或任何 n 維數組。下圖分別展示了1維張量,2維張量和3維張量:接下來我們看看如何創建張量。
我們導入pytorch和numpy
import torch
import numpy as np
我們可以看看張量的相關參數:
torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)其中:data: 數據,可以是list,numpy的ndarray
dtype: 數據類型,默認與data的類型一致
device: 所在設備,gpu/cpu
requires_grad: 是否需要梯度,因爲神經網絡結構經常會要求梯度
pin_memory: 是否存於鎖頁內存
使用Numpy創建張量通過np創建ndarray,然後轉化爲張量,數據類型默認與data一致,這裏是創建了一個33的全1張量:arr = np.ones((3,3))print(“數據類型爲:”,arr.dtype)t = torch.tensor(arr)print(t)如果你已經搭建了GPU環境,可以通過如下代碼將張量創建在GPU上(創建需要幾秒的等待時間):arr = np.ones((3,3))print(“數據類型爲:”,arr.dtype)t = torch.tensor(arr,device=‘cuda’)print(t)還有一種通過Numpy創建張量的方法,是使用torch.from_numpy(ndarray)。torch.from_numpy(ndarray)我們可以看到,它只需要接受一個ndarray即可。arr = np.array([[1,2,3],[4,5,6]])t = torch.from_numpy(arr)print(arr)print(t)但是要注意的一點是:從torch.from_numpy創建的tensor和ndarray共享內存,當修改其中一個的數據,另外一個也會被修改。例如我們修改array的內容:arr = np.array([[1,2,3],[4,5,6]])t = torch.from_numpy(arr)#修改array內容arr[0,0] = 999print(arr)print(t)或是我們修改張量的內容:arr = np.array([[1,2,3],[4,5,6]])t = torch.from_numpy(arr)#修改tensor內容t[0,0] = -888print(arr)print(t)創建全0張量我們可以通過torch.zeros()來創建全0張量:zeros(size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)其中:size:爲張量的形狀out:輸出的張量dtype: 數據類型layout:內存中的佈局形式,有strided,sparse_coo等device:所在設備,gpu/cpurequires_grad:是否需要梯度t1 = torch.tensor([1,2,3])#創建一個t1張量,賦一個初始值t = torch.zeros((2,3),out=t1)#將創建的t張量輸出到t1print(t,’\n’,t1)print(id(t),id(t1),id(t)==id(t1))我們通過上面顯示的id發現,t和t1的id相同,所以t和t1在內存中指向的內存塊相同。通過torch.zeros_like()也可以創建全0張量:torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False)會根據input形狀創建全0張量,例如我們創建一個35的全0張量:input = torch.empty(3, 5)t = torch.zeros_like(input)print(t)創建全1張量全1張量的創建和全0張量的創建方式基本一致,使用如下方式創建:torch.ones()torch.ones_like()根據數值創建張量torch.fulltorch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)其中的新出現參數:fill_value: 填充的值例如創建一個22的元素都是8的張量:t = torch.full((2,2),8)print(t)torch.full_like()torch.full_like(input, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)input = torch.empty(3, 5)t = torch.full_like(input,8)print(t)上面是根據input的形狀創建了一個元素都爲8的張量。創建等差的1維張量可以通過torch.arange()創建等差的一維張量:arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)其中:start:數列的起始值end:數列的結束值,取不到,只能取到 end-1step:公差(步長),默認爲 1t = torch.arange(1,9,2)print(t)創建等間距(均分)的1維張量torch.linspace()linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)其中:steps:創建出的一維張量的元素個數end:結束位置可以取到t = torch.linspace(1,9,5)print(t)t = torch.linspace(1,9,7)print(t)創建對數均分的1維張量torch.logspace()logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)參數:base: 對數函數的底,默認爲10t = torch.logspace(start=-5, end=10,steps=4)print(t)創建單位對角矩陣(2維張量)torch.eye()torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)參數:m:矩陣行數n:矩陣列數t = torch.eye(4)print(t)默認爲方陣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章