PyTorch随笔-5
一、
1.PyTorch簡介
PyTorch是一個優化的張量庫,2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出,它是一個基于Python的可續計算包,可使用gpu和cpu進行深度學習,此外還支持動態神經網絡。
PyTorch具有以下優點:
(1)PyTorch是相當簡潔且高效快速的框架。
(2)設計追求最少的封裝。
(3)設計符合人類思維,它讓用戶盡可能地專注于實現自己的想法。
(4)與google的Tensorflow類似,FAIR的支持足以確保PyTorch獲得持續的開發更新。
(5)PyTorch由作者親自維護其論壇,以供用戶交流和求教問題。
(6)入門簡單。
1.Torch
包 torch 包含了多維張量的數據結構以及基于其上的多種數學操作。另外,它也提供了多種工具,其中一些可以更有效地對張量和任意類型進行序列化。
它有CUDA 的對應實現,可以在NVIDIA GPU上進行張量運算(計算能力>=2.0)。
1.1 張量 Tensors
1.torch.is_tensor(obj)
如果obj 是一個pytorch張量,則返回True
參數: obj (Object) – 判斷對象
/usr/bin/env python3
-- coding: utf-8 --
import torch
shape=(3,2,)
x_data = torch.zeros(shape)
print(f"Tensor: \n {x_data} \n")
print(f"IsTensor: \n {torch.is_tensor(x_data)} \n")
Tensor:
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
IsTensor:
True
2.torch.is_storage [source]
torch.is_storage(obj)
如何obj 是一個pytorch storage對象,則返回True
/usr/bin/env python3
-- coding: utf-8 --
import torch
shape=(3,2,)
x_data = torch.ones(shape)
print(f"Tensor: \n {x_data} \n")
print(f"is_storage: \n {torch.is_storage(x_data)} \n")
tensor([[1., 1.],
[1., 1.],
[1., 1.]])
is_storage:
False
3.
2.Tensor
2.1 概述
Tensor中文稱為張量,張量(tensor)理論是數學的一個分支學科,張量在數學上定義為:它是矢量概念的推廣,向量(指具有大小和方向的量)是一階張量,是張量的特例,張量可表示的內容比向量更豐富,它可用來表示向量、標量(標量只有大小,沒有方向)和其他張量之間的線性關系的多線性函數。
在PyTorch中,Tensor是一種特殊的數據結構,非常類似于數組和矩陣,它被用來編碼模型的輸入和輸出,以及模型的參數。Tensor類似于NumPy的ndarray,但比NumPy更強大,Tensor還可以在gpu或其他硬件加速器上運行。事實上,Tensor和NumPy數組通常可以共享相同的底層內存,從而消除了復制數據的需要。張量也被優化為自動微分。
2.2 張量定義
一、創建張量
在Pytorch中創建張量的方法取決于實際應用場景,主要有以下幾種方法:
1、torch.tensor函數
用預先存在的數據創建張量,可使用torch.tensor函數。函數格式如下:
torch.tensor(data, , dtype=None, device=None, requires_grad=False, pin_memory=False) → Tensor
該函數有以下幾個參數。
(1)Data:表示要構造張量的數據,可以是list、tuple、NumPy ndarray、scalar和其他類型。
(2)dtype (torch.dtype,可選參數) :期望返回張量的數據類型。默認參數值為None,即:從數據推斷數據類型。
(3)device (torch.device,可選參數):用于CPU的CPU張量類型或用于CUDA的CUDA張量類型,參數值由設備類型(‘cpu’或’cuda’)和可選的設備的序號組成(如果設備序號不存在,該對象將始終代表設備類型的當前設備),比如:
torch.device(‘cuda:0’)或torch.device(‘cuda’, 0)表示0號cuda設備。
torch.device(‘cpu:0’)或torch.device(‘cpu’, 0)表示0號cpu設備。
默認參數值為None,即:使用當前設備作為默認張量類型(參見torch.set_default_tensor_type())。
(4)requires_grad (bool,可選參數):autograd是否記錄返回張量的操作。默認值:False。
(5)pin_memory (bool,可選參數) :返回的張量是否被分配到固定的內存中。只適用于CPU張量。默認值:False。
2、torch. tensor 函數創建具有特定大小的張量。
3、torch.like函數創建一個與另一個張量具有相同大小(和類似類型)的張量。
4、tensor.new 函數創建與另一個張量類型相似但大小不同的張量。
5、torch.Tensor類
這不是一個函數,而是包含單一數據類型元素的多維矩陣類,是默認的tensor類(torch.FloatTensor) 的簡稱。前述1-4方法調用成功后返回結果都是Tensor類對象。
二、張量基本操作
下面以幾個例子具體講解張量的基本操作。
1、程序1-2-2-1.py創建了一個空tensor,為2*5的矩陣(空矩陣的元素值為未初始化狀態,可理解為隨機值)。
#!/usr/bin/env python3
-- coding: utf-8 --
#1-2-2-1.py
import torch
x=torch.Tensor(2,5)
print(x)
程序輸出結果如下:
tensor([[3.8335e-40, 3.8338e-40, 9.1835e-41, 1.0691e+24, 4.1588e+21],
[1.8128e+34, 2.1565e+29, 8.6163e+09, 1.8004e+25, 1.8032e+22]])
2、程序1-2-2-2.py創建一個空tensor,為3*5的矩陣,并返回tensor矩陣元素數據類型為torch.float32和矩陣的類型torch.FloatTensor。
#!/usr/bin/env python3
-- coding: utf-8 --
#1-2-2-2.py
import torch
x=torch.Tensor(3,5)
print(x.dtype)
print(x.type())
程序執行結果如下:
torch.float32
torch.FloatTensor
3、程序1-2-2-3.py創建了幾個空tensor,都為3*5的矩陣,然后依次輸出它們元素數據類型和矩陣數據類型。
#!/usr/bin/env python3
-- coding: utf-8 --
#1-2-2-3.py
import torch
x=torch.DoubleTensor(3,5)
print(x.dtype)
print(x.type())
y=torch.BoolTensor(3,5)
print(y.dtype)
print(y.type())
程序執行結果如下:
torch.float64
torch.DoubleTensor
torch.bool
torch.BoolTensor
觀察程序1-2-2-3.py及上述執行結果,不難看出:x是雙精度浮點數(float64)類矩陣DoubleTensor,而是y布爾(邏輯)類矩陣BoolTensor。
4、程序1-2-2-4.py依次使用Python的列表和元組構造Tensor。
#!/usr/bin/env python3
-- coding: utf-8 --
#1-2-2-4.py
import torch
x1=torch.tensor([[10,20],[2,4]])
print(x1)
print(x1.size())
y=((11,21),(11,66))
x2=torch.tensor(y)
print(x2)
執行結果如下:
tensor([[10, 20],
[ 2, 4]])
torch.Size([2, 2])
tensor([[11, 21],
[11, 66]])
程序1-2-2-4.py首先傳入列表為參數,調用torch.tensor函數定義FloatTensor類矩陣x1,并輸出矩陣元素及其大小(2*2);然后傳入元組y作為參數,調用torch.tensor函數定義FloatTensor類矩陣x2,并輸出矩陣元素。
5、程序1-2-2-5.py依次定義雙精度矩陣和整數型矩陣。
#!/usr/bin/env python3
-- coding: utf-8 --
#1-2-2-5.py
import torch
a=[[10.2,20.6],[2,4]]
x=torch.DoubleTensor(a)
print(x)
y=torch.IntTensor(a)
print(y)
b=[[1,2],[3,4]]
z=torch.IntTensor(b)
print(z)
程序運行結果如下:
tensor([[10.2000, 20.6000],
[ 2.0000, 4.0000]], dtype=torch.float64)
D:\pro\learnAIpy\src\1-2-2-5.py:8: DeprecationWarning: an integer is required (got type float). Implicit conversion to integers using int is deprecated, and may be removed in a future version of Python.
y=torch.IntTensor(a)
tensor([[10, 20],
[ 2, 4]], dtype=torch.int32)
tensor([[1, 2],
[3, 4]], dtype=torch.int32)
2.3 初始化張量
2.3.1 從數據中創建
張量可以直接從數據中創建,自動判斷數據類型。
import torch
data = [[11.0, 2],[3, 44.0]]
x_data = torch.tensor(data)
print(x_data)
data = [[11, 2],[3, 44]]
x_data = torch.tensor(data)
print(x_data)
運行結果:
tensor([[11., 2.],
[ 3., 44.]])
tensor([[11, 2],
[ 3, 44]])
使用 torch.Tensor.item() 從包含單個值的張量中獲取Python數,請執行以下操作:
import torch
y=torch.tensor([[1,2],[3,4]])
print(y)
print(y[1,1].item())
tensor([[1, 2],
[3, 4]])
2.3.2 從NumPy 數組創建
import torch
import numpy as np
data = [[11.0, 2],[3, 44.0]]
np_array=np.array(data)
x_np = torch.from_numpy(np_array)
print(x_np)
運行結果:
tensor([[11., 2.],
[ 3., 44.]], dtype=torch.float64)
如果有一個numpy數組并希望避免復制 ,可使用torch.as_tensor()。
import torch
import numpy as np
a = np.arange(8)
b = a.reshape(4,2)
print (b)
y=torch.torch.as_tensor(b)
print(y)
y[1][1]=55
print(y)
print(b)
[[0 1]
[2 3]
[4 5]
[6 7]]
tensor([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
tensor([[ 0, 1],
[ 2, 55],
[ 4, 5],
[ 6, 7]])
[[ 0 1]
[ 2 55]
[ 4 5]
[ 6 7]]
2.3.3 從其它tensor創建
import torch
import numpy as np
data = [[11.0, 2],[3, 44.0]]
x_data = torch.tensor(data)
print(f”Tensor: \n {x_data} \n")
運行結果:
Tensor:
tensor([[11., 2.],
[ 3., 44.]])
2.3.4 隨機值創建tensor
import torch
import numpy as np
shape=(3,4,)
x_data = torch.rand(shape)
print(f"Tensor: \n {x_data} \n")
運行結果:
Tensor:
tensor([[0.5137, 0.2523, 0.4290, 0.8971],
[0.6080, 0.6341, 0.3161, 0.1189],
[0.5905, 0.0437, 0.0408, 0.5235]])
2.3.5 零矩陣、單位矩陣等
import torch
import numpy as np
shape=(3,4,)
x_data = torch.zeros(shape)
print(f"Tensor: \n {x_data} \n")
x_data = torch.ones(shape)
print(f"Tensor: \n {x_data} \n")
運行結果:
Tensor:
tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
Tensor:
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
單位矩陣
在線性代數中,n階單位矩陣,是一個n × n 的方形矩陣,其主對角線元素為1,其余元素為0。在矩陣的乘法中,起著特殊的作用,如同數的乘法中的1,根據單位矩陣的特點,任何矩陣與單位矩陣相乘都等于本身。
print(torch.eye(5))#對象線為1,其余為0,單位矩陣
tensor([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
import torch
print(torch.zeros(2,3,2))
print(torch.ones(2,4))
print(torch.rand(2,3))#[0,1]隨機數
print(torch.arange(2,8))#序列
print(torch.arange(2,10,3))
tensor([[[0., 0.],
[0., 0.],
[0., 0.]],
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
tensor([[0.2293, 0.5129, 0.2397],
[0.3889, 0.5081, 0.4054]])
tensor([2, 3, 4, 5, 6, 7])
tensor([2, 5, 8])
2.3.6 torch數據類型
Pytorch的張量的數據類型以數值類型為主,定義了以下幾種CPU張量和對應的GPU張量類型,如下表所示。
數據類型 dtype CPU張量 GPU張量
32-bit floating point torch.float32?or?torch.float torch.FloatTensor torch.cuda.FloatTensor
64-bit floating point torch.float64?or?torch.double torch.DoubleTensor torch.cuda.DoubleTensor
16-bit floating point?1 torch.float16?or?torch.half torch.HalfTensor torch.cuda.HalfTensor
16-bit floating point?2 torch.bfloat16 torch.BFloat16Tensor torch.cuda.BFloat16Tensor
32-bit complex torch.complex32
64-bit complex torch.complex64
128-bit complex torch.complex128?or?torch.cdouble
8-bit integer (unsigned) torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
8-bit integer (signed) torch.int8 torch.CharTensor torch.cuda.CharTensor
16-bit integer (signed) torch.int16?or?torch.short torch.ShortTensor torch.cuda.ShortTensor
32-bit integer (signed) torch.int32?or?torch.int torch.IntTensor torch.cuda.IntTensor
64-bit integer (signed) torch.int64?or?torch.long torch.LongTensor torch.cuda.LongTensor
Boolean torch.bool torch.BoolTensor torch.cuda.BoolTensor
2.3.7 torch所在設備
torch.device是一個對象,它代表一個torch所在的設備,張量被分配在該設備里。device包含一個設備類型(‘cpu’或’cuda’)和設備類型的可選設備序號。 如果設備序號不存在,這個對象將始終代表設備類型的當前設備。
特定數據類型的tensor可以被構造,通過 torch.dtype和/或torch.device,對于構造函數或張量創建操作。
cuda0 = torch.device(‘cuda:0’)
torch.ones([2, 4], dtype=torch.float64, device=cuda0)
tensor([[ 1.0000, 1.0000, 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000, 1.0000]], dtype=torch.float64, device=‘cuda:0’)
2.4 tensor訪問與操作
2.4.1 索引和切片表示法
可以使用Python的索引和切片表示法訪問和修改tensor的內容:
import torch
y=torch.tensor([[1,2],[3,4]])
print(y)
print(y[1,:])
print(y[:,0])
print(y[:,1])
tensor([[1, 2],
[3, 4]])
tensor([3, 4])
tensor([1, 3])
tensor([2, 4])
2.4.2 記錄操作
可使用requires_grad=True創建張量,以便torch.autograd記錄對它們的操作以進行自動區分。
import torch
x = torch.tensor([[1., 2.], [3., 4.]], requires_grad=True)
out = x.pow(2).sum()
out.backward()
print(x.grad)
tensor([[2., 4.],
[6., 8.]])
2.4.3 tensor 數據保存
每個 tensor 都有一個相關的 torch.Storage,,它保存數據。tensor類還提供了存儲的多維、跨視圖,并定義了對存儲的數字操作。
改變tensor的方法用下劃線后綴標記。例如,torch.FloatTensor.abs_()就地計算絕對值并返回修改后的張量,而torch.FloatTensor.abs_()以新的tensor張量計算結果。
改變現有的張量 torch.device 和/或torch.dtype,考慮對張量使用to()方法。
當前執行的 torch.Tensor 引入內存開銷,因此在具有許多小張量tensor的應用程序中可能會導致意外的高內存使用率
二、
總結
以上是生活随笔為你收集整理的PyTorch随笔-5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 添加where 1= 1 是
- 下一篇: pytorch随笔-6