Tensor是深度學習的基本類型,我們常用的說法有,標量、向量、矩陣如下:
標量(Scalar)是隻有大小,沒有方向的量,如1,2,3等
向量(Vector)是有大小和方向的量,其實就是一串數字,如(1,2)
矩陣(Matrix)是好幾個向量拍成一排合併而成的一堆數字,如[1,2;3,4]
其實標量,向量,矩陣它們三個也是張量,標量是零維的張量,向量是一維的張量,矩陣是二維的張量。張量可以擴展到多維。
tensor的創建方法大致分成四類
- 已經存在的數據構造使用
torch.tensor()
. - 根據形狀創建tensor,使用
torch.*
(見 Creation Ops). - 根據已有形狀創建tensor 使用
torch.*_like
(見 Creation Ops). - T創建一個與現有形狀不一樣的tensor,使用
tensor.new_*
.
1 torch.tensor構造函數
torch.tensor(data, dtype=None, device=None, requires_grad=False)
-
data(數組) – 初始化的tensor數據,可以是list, tuple, NumPy
ndarray
, scalar, 或者其他類型. -
dtype [
torch.dtype
]–tensor的數據類型.默認值: ifNone
, - device torch.device類型,目前支持兩種cpu和cuda,表示該變量存儲位置,
- requires_grad – 是否需要自動求導,默認是False.
1.2 torch支持的數據類型
Data type | dtype | Tensor types |
---|---|---|
32-bit 浮點 | torch.float32 or torch.float | torch.*.FloatTensor |
64-bit 浮點 | torch.float64 or torch.double | torch.*.DoubleTensor |
16-bit 浮點 | torch.float16 or torch.half | torch.*.HalfTensor |
8-bit 無符號整形 | torch.uint8 | torch.*.ByteTensor |
8-bit 有符號整形 | torch.int8 | torch.*.CharTensor |
16-bit 有符號整形 | torch.int16 or torch.short | torch.*.ShortTensor |
32-bit 有符號整形 | torch.int32 or torch.int | torch.*.IntTensor |
64-bit 有符號整形 | torch.int64 or torch.long | torch.*.LongTensor |
1.3 torch.device的構造方法
字符串
torch.device('cpu')
torch.device('cuda')
torch.tensor((2,3),device='cuda')
字符串和數字
torch.device('cuda:0')
torch.device('cuda', 0)
torch.device('cpu', 0)
直接使用數字
device=torch.device(0)
torch.randn((2,3), device=0)
1.4 例子
>>> torch.tensor([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])
tensor([[ 0.1000, 1.2000],
[ 2.2000, 3.1000],
[ 4.9000, 5.2000]])
>>> torch.tensor([0, 1]) # Type inference on data
tensor([ 0, 1])
>>> torch.tensor([[0.11111, 0.222222, 0.3333333]],
dtype=torch.float64,
device=torch.device('cuda:0')) # creates a torch.cuda.DoubleTensor
tensor([[ 0.1111, 0.2222, 0.3333]], dtype=torch.float64, device='cuda:0')
>>> torch.tensor(3.14159) # Create a scalar (zero-dimensional tensor)
tensor(3.1416)
>>> torch.tensor([]) # Create an empty tensor (of size (0,))
tensor([])
2 根據形狀創建tensor
目前有如下操作:
torch.rand()
torch.randn()
torch.randint()
torch.randperm()
torch.empty()
torch.bernoulli
torch.multinomial
-
torch.normal()
......
2.1 torch.rand
根據size創建[0,1]的隨機數tensor
>>> torch.rand(4)
tensor([ 0.5204, 0.2503, 0.3525, 0.5673])
>>> torch.rand(2, 3)
tensor([[ 0.8237, 0.5781, 0.6879],
[ 0.3816, 0.7249, 0.0998]])
import matplotlib.pyplot as plt
import matplotlib
import torch
%matplotlib inline
N = 4000
a = torch.rand(N)
b = range(N)
plt.figure(figsize=(10,8))
plt.scatter(b,a.numpy(), color='g')
plt.show()
2.2 torch.randn
根據size創建標準正太分佈的隨機數tensor,均值0,方差1
import matplotlib.pyplot as plt
import matplotlib
import torch
%matplotlib inline
N = 4000
a = torch.randn(N)
b = range(N)
plt.figure(figsize=(10,8))
plt.scatter(b,a.numpy(), color='g')
plt.show()
2.3 torch.randint
自定義最大值和最小值,根據形狀創建隨機數
torch.randint(low=0, high, size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
size需要一個元組,此處需要注意
例如獲取[-150,100]之間的4000個隨機數
import matplotlib.pyplot as plt
import matplotlib
import torch
%matplotlib inline
N = 4000
a = torch.randint(-150, 100, (N,))
b = range(N)
plt.figure(figsize=(10,8))
plt.scatter(b,a.numpy(), color='r')
plt.show()
2.4 torch.randperm
隨機獲取0,1,...,n-1的組合
>>> torch.randperm(4)
tensor([ 2, 1, 0, 3])
3 根據已有數據形狀創建tensor
-
torch.rand_like()
輸入數據求尺寸input.size(),調用torch.rand_like -
torch.randn_like()
輸入數據求尺寸input.size(),調用torch.randn -
torch.randint_like()
輸入數據求尺寸input.size(),調用torch.randint