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

pytorch基本數據類型——張量(Tensor),那張量到底是什麼呢?張量類似於Numpy中的ndarray,我們都知道深度學習的基礎是神經網絡結構,而在Pytorch中,張量是構建神經網絡的基礎。

比較重要的一點是張量可以在GPU上進行計算。所以從本質上來說,PyTorch 是一個處理張量的庫。一個張量是一個數字、向量、矩陣或任何 n 維數組。

下面分別展示了1維張量,2維張量和3維張量:接下來我們看看如何創建張量。

張量的相關參數:
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一致,這裏是創建了一個3*3的全1張量:

import torch
import numpy as np
arr = np.ones((3,3))
print("數據類型爲:",arr.dtype) #數據類型爲: float64
t = torch.tensor(arr)
print(t)

如果你已經搭建了GPU環境,可以通過如下代碼將張量創建在GPU上:

arr = np.ones((3,3))#np數組的常用函數
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] = 999
print(arr)
print(t)

或是我們修改張量的內容:

arr = np.array([[1,2,3],[4,5,6]])
t = torch.from_numpy(arr)#修改tensor內容
t[0,0] = -888
print(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/cpu
requires_grad:是否需要梯度

t1 = torch.tensor([1,2,3])#創建一個t1張量,賦一個初始值
t = torch.zeros((2,3),out=t1)#將創建的t張量輸出到t1
print(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張量,例如我們創建一個3*5的全0張量:

input = torch.empty(3, 5)
t = torch.zeros_like(input)
print(t)

全1張量的創建和全0張量的創建方式基本一致,使用如下方式創建:torch.ones()
torch.ones_like()

根據數值創建張量torch.full
torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
其中的新出現參數:fill_value: 填充的值

例如創建一個2*2的元素都是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-1
step:公差(步長),默認爲 1
t = torch.arange(1,9,2)
print(t)

創建等間距(均分)的1維張量
torch.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(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
參數:base: 對數函數的底,默認爲10

t = torch.logspace(start=-5, end=10,steps=4)
print(t)

創建單位對角矩陣(2維張量)
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)#默認爲方陣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章