pytorch tensor_[PyTorch 学习笔记] 1.2 Tensor(张量)介绍
- https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py
- https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py
Tensor 的概念
Tensor 中文為張量。張量的意思是一個多維數組,它是標量、向量、矩陣的高維擴展。
標量可以稱為 0 維張量,向量可以稱為 1 維張量,矩陣可以稱為 2 維張量,RGB 圖像可以表示 3 維張量。你可以把張量看作多維數組。
Tensor 與 Variable
在 PyTorch 0.4.0 之前,torch.autograd 包中存在 Variable 這種數據類型,主要是用于封裝 Tensor,進行自動求導。Variable 主要包含下面幾種屬性。
- data: 被包裝的 Tensor。
- grad: data 的梯度。
- grad_fn: 創建 Tensor 所使用的 Function,是自動求導的關鍵,因為根據所記錄的函數才能計算出導數。
- requires_grad: 指示是否需要梯度,并不是所有的張量都需要計算梯度。
- is_leaf: 指示是否葉子節點(張量),葉子節點的概念在計算圖中會用到,后面詳細介紹。
在 PyTorch 0.4.0 之后,Variable 并入了 Tensor。在之后版本的 Tensor 中,除了具有上面 Variable 的 5 個屬性,還有另外 3 個屬性。
- dtype: 張量的數據類型,如 torch.FloatTensor,torch.cuda.FloatTensor。
- shape: 張量的形狀。如 (64, 3, 224, 224)
- device: 張量所在設備 (CPU/GPU),GPU 是加速計算的關鍵
關于 dtype,PyTorch 提供了 9 種數據類型,共分為 3 大類:float (16-bit, 32-bit, 64-bit)、integer (unsigned-8-bit ,8-bit, 16-bit, 32-bit, 64-bit)、Boolean。模型參數和數據用的最多的類型是 float-32-bit。label 常用的類型是 integer-64-bit。
Tensor 創建的方法
直接創建 Tensor
torch.tensor()
torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)- data: 數據,可以是 list,numpy
- dtype: 數據類型,默認與 data 的一致
- device: 所在設備,cuda/cpu
- requires_grad: 是否需要梯度
- pin_memory: 是否存于鎖頁內存
代碼示例:
arr = np.ones((3, 3)) print("ndarray的數據類型:", arr.dtype) # 創建存放在 GPU 的數據 # t = torch.tensor(arr, device='cuda') t= torch.tensor(arr) print(t)輸出為:
ndarray的數據類型: float64 tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]], dtype=torch.float64)torch.from_numpy(ndarray)
從 numpy 創建 tensor。利用這個方法創建的 tensor 和原來的 ndarray 共享內存,當修改其中一個數據,另外一個也會被改動。
代碼示例:
arr = np.array([[1, 2, 3], [4, 5, 6]]) t = torch.from_numpy(arr)# 修改 array,tensor 也會被修改 # print("n修改arr") # arr[0, 0] = 0 # print("numpy array: ", arr) # print("tensor : ", t)# 修改 tensor,array 也會被修改 print("n修改tensor") t[0, 0] = -1 print("numpy array: ", arr) print("tensor : ", t)輸出為:
修改tensor numpy array: [[-1 2 3][ 4 5 6]] tensor : tensor([[-1, 2, 3],[ 4, 5, 6]], dtype=torch.int32)根據數值創建 Tensor
torch.zeros()
torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:根據 size 創建全 0 張量
- size: 張量的形狀
- out: 輸出的張量,如果指定了 out,那么torch.zeros()返回的張量和 out 指向的是同一個地址
- layout: 內存中布局形式,有 strided,sparse_coo 等。當是稀疏矩陣時,設置為 sparse_coo 可以減少內存占用。
- device: 所在設備,cuda/cpu
- requires_grad: 是否需要梯度
代碼示例:
out_t = torch.tensor([1]) # 這里制定了 out t = torch.zeros((3, 3), out=out_t) print(t, 'n', out_t) # id 是取內存地址。最終 t 和 out_t 是同一個內存地址 print(id(t), id(out_t), id(t) == id(out_t))輸出是:
tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]])tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]]) 2984903203072 2984903203072 Truetorch.zeros_like
torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False, memory_format=torch.preserve_format)功能:根據 input 形狀創建全 0 張量
- input: 創建與 input 同形狀的全 0 張量
- dtype: 數據類型
- layout: 內存中布局形式,有 strided,sparse_coo 等。當是稀疏矩陣時,設置為 sparse_coo 可以減少內存占用。
同理還有全 1 張量的創建方法:torch.ones(),torch.ones_like()。
torch.full(),torch.full_like()
torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:創建自定義數值的張量
- size: 張量的形狀,如 (3,3)
- fill_value: 張量中每一個元素的值
代碼示例:
t = torch.full((3, 3), 1) print(t)輸出為:
tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])torch.arange()
torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:創建等差的 1 維張量。注意區間為[start, end)。
- start: 數列起始值
- end: 數列結束值,開區間,取不到結束值
- step: 數列公差,默認為 1
代碼示例:
t = torch.arange(2, 10, 2) print(t)輸出為:
tensor([2, 4, 6, 8])torch.linspace()
torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:創建均分的 1 維張量。數值區間為 [start, end]
- start: 數列起始值
- end: 數列結束值
- steps: 數列長度 (元素個數)
代碼示例:
# t = torch.linspace(2, 10, 5) t = torch.linspace(2, 10, 6) print(t)輸出為:
tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 8.4000, 10.0000])torch.logspace()
torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:創建對數均分的 1 維張量。數值區間為 [start, end],底為 base。
- start: 數列起始值
- end: 數列結束值
- steps: 數列長度 (元素個數)
- base: 對數函數的底,默認為 10
代碼示例:
# t = torch.linspace(2, 10, 5) t = torch.linspace(2, 10, 6) print(t)輸出為:
tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 8.4000, 10.0000])torch.eye()
torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:創建單位對角矩陣( 2 維張量),默認為方陣
- n: 矩陣行數。通常只設置 n,為方陣。
- m: 矩陣列數
根據概率創建 Tensor
torch.normal()
torch.normal(mean, std, *, generator=None, out=None)功能:生成正態分布 (高斯分布)
- mean: 均值
- std: 標準差
有 4 種模式:
代碼示例:
# mean:標量 std: 標量 # 這里需要設置 size t_normal = torch.normal(0., 1., size=(4,)) print(t_normal)
輸出為:
tensor([0.6614, 0.2669, 0.0617, 0.6213])
代碼示例:# mean:張量 std: 標量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}nstd:{}".format(mean, std))
print(t_normal)
輸出為:
mean:tensor([1., 2., 3., 4.])
std:1
tensor([1.6614, 2.2669, 3.0617, 4.6213])
這 4 個數采樣分布的均值不同,但是方差都是 1。
代碼示例:# mean:張量 std: 張量
mean = torch.arange(1, 5, dtype=torch.float)
std = torch.arange(1, 5, dtype=torch.float)
t_normal = torch.normal(mean, std)
print("mean:{}nstd:{}".format(mean, std))
print(t_normal)
輸出為:
mean:tensor([1., 2., 3., 4.])
std:tensor([1., 2., 3., 4.])
tensor([1.6614, 2.5338, 3.1850, 6.4853])
其中 1.6614 是從正態分布 中采樣得到的,其他數字以此類推。
torch.randn() 和 torch.randn_like()
torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:生成標準正態分布。
- size: 張量的形狀
torch.rand() 和 torch.rand_like()
torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:在區間 [0, 1) 上生成均勻分布。
torch.randint() 和 torch.randint_like()
randint(low=0, high, size, *, generator=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)功能:在區間 [low, high) 上生成整數均勻分布。
- size: 張量的形狀
torch.randperm()
torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)功能:生成從 0 到 n-1 的隨機排列。常用于生成索引。
- n: 張量的長度
torch.bernoulli()
torch.bernoulli(input, *, generator=None, out=None)功能:以 input 為概率,生成伯努利分布 (0-1 分布,兩點分布)
- input: 概率值
參考資料
- 深度之眼 PyTorch 框架班
如果你覺得這篇文章對你有幫助,不妨點個贊,讓我有更多動力寫出好文章。
我的文章會首發在公眾號上,歡迎掃碼關注我的公眾號張賢同學。
總結
以上是生活随笔為你收集整理的pytorch tensor_[PyTorch 学习笔记] 1.2 Tensor(张量)介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s使用volume将ConfigMa
- 下一篇: au加载默认的输入和输出设备失败_一文带