1. 程式人生 > 其它 >Tensor概念和建立

Tensor概念和建立

Tensor的概念

張量是一個多維陣列,它是標量、向量、矩陣的高維拓展。


Tensor與Variable

Variable是torch.autograd中的資料型別
主要用於封裝Tensor,進行自動求導

  • data: 被包裝的Tensor
  • grad: data的梯度
  • grad_fn: 建立Tensor的Function,是自動求導的關鍵
  • requires_grad: 指示是否需要梯度
  • is_leaf: 指示是否是葉子結點(張量)


PyTorch0.4.0版開始,Variable併入Tensor

  • dtype: 張量的資料型別,如torch.FloatTensor,torch.cuda.FloatTensor
  • shape: 張量的形狀,如(64,3,224,224)
  • device:張量所在裝置,GPU/CPU,是加速的關鍵

Tensor建立

直接建立

torch.tensor

torch.tensor()
功能:從data建立tensor

  • data: 資料,可以是list,numpy
  • dtype: 資料型別,預設與data的一致
  • device: 所在裝置,cuda/cpu
  • requires_grad:是否需要梯度
  • pin_memory:是否存於鎖頁記憶體
import torch
import numpy as np
torch.manual_seed(1)

# ===============================  exmaple 1 ===============================
# 通過torch.tensor建立張量
#
# flag = True
flag = False
if flag:
    arr = np.ones((3, 3))
    print("ndarray的資料型別:", arr.dtype)

    t = torch.tensor(arr, device='cuda')
    # t = torch.tensor(arr)

    print(t)

torch.from_numpy

torch.from_numpy(ndarray)
功能:從numpy建立tensor
注意事項:從torch.from_numpy建立的tensor與原ndarray共享記憶體,當修改其中一個的資料,另外一個也將會被改動

# 通過torch.from_numpy建立張量
# flag = True
flag = False
if flag:
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    t = torch.from_numpy(arr)
    # print("numpy array: ", arr)
    # print("tensor : ", t)

    # print("\n修改arr")
    # arr[0, 0] = 0
    # print("numpy array: ", arr)
    # print("tensor : ", t)

    print("\n修改tensor")
    t[0, 0] = -1
    print("numpy array: ", arr)
    print("tensor : ", t)

依據數值建立

torch.zeros

torch.zeros()
功能:依size建立全0張量

  • size: 張量的形狀,如(3,3)、(3,224,224)
  • out: 輸出的張量
  • layout: 記憶體中佈局形式,有strided,sparse_coo等
  • device: 所在裝置,gpu/cpu
  • requires_grad:是否需要梯度
# 通過torch.zeros建立張量
# flag = True
flag = False
if flag:
    out_t = torch.tensor([1])

    t = torch.zeros((3, 3), out=out_t)

    print(t, '\n', out_t)
    print(id(t), id(out_t), id(t) == id(out_t))

torch.zeros_like

torch.zeros_like()
功能:依input形狀建立全0張量

  • intput: 建立與input同形狀的全0張量
  • dtype: 資料型別
  • layout: 記憶體中佈局形式

torch.ones和torch.ones_like

torch.ones()
torch.ones_like()
功能:依input形狀建立全1張量

  • size: 張量的形狀,如(3,3)、(3,224,224)
  • dtype: 資料型別
  • layout: 記憶體中佈局形式
  • device: 所在裝置,gpu/cpu
  • requires_grad: 是否需要梯度

torch.full與torch.full_like

torch.full()
torch.full_like()
功能:依input形狀建立指定資料的張量

  • size: 張量的形狀,如(3,3)
  • fill_value: 張量的值
# 通過torch.full建立全1張量
# flag = True
flag = False
if flag:
    t = torch.full((3, 3), 1)
    print(t)

torch.arange

torch.arange()
功能:建立等差的1維張量注意事項:數值區間為[start,end)

  • start: 數列起始值
  • end: 數列“結束值”
  • step: 數列公差,預設為1
# 通過torch.arange建立等差數列張量
# flag = True
flag = False
if flag:
    t = torch.arange(2, 10, 2)
    print(t)

torch.linspace

torch.linspace()
功能:建立均分的1維張量注意事項:數值區間為[start,end]

  • start: 數列起始值
  • end: 數列結束值
  • steps: 數列長度
# 通過torch.linspace建立均分數列張量
# flag = True
flag = False
if flag:
    # t = torch.linspace(2, 10, 5)
    t = torch.linspace(2, 10, 6)
    print(t)

torch.logspace

torch.logspace()
功能:建立對數均分的1維張量注意事項:長度為steps,底為base

  • start: 數列起始值
  • end: 數列結束值
  • steps: 數列長度
  • base: 對數函式的底,預設為10

torch.eye

torch.eye()
功能:建立單位對角矩陣(2維張量)注意事項:預設為方陣

  • n: 矩陣行數
  • m: 矩陣列數

依據概率建立

torch.normal

torch.normal()
功能:生成正態分佈(高斯分佈)

  • mean: 均值
  • std: 標準差

四種模式:

  • mean為標量,std為標量
  • mean為標量, std為張量
  • mean為張量,std為標量
  • mean為張量,std為張量
# 通過torch.normal建立正態分佈張量
flag = True
# flag = False
if flag:

    # 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:標量 std: 標量
    # t_normal = torch.normal(0., 1., size=(4,))
    # print(t_normal)

    # 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)

torch.randn

torch.randn()
torch.randn_like()
功能:生成標準正態分佈

  • size: 張量的形狀

torch.rand和torch.randint

torch.rand()
torch.rand_like()
功能:在區間[0,1)上,生成均勻分佈torch.randint()
torch.randint_like()功能:區間[low,high)生成整數均勻分佈

  • size:張量的形狀

torch.randperm和torch.bernoulli

torch.randperm()
功能:生成生成從0到n-1的隨機排列

  • n:張量的長度3.9

torch.bernoulli()
功能:以input為概率,生成伯努力分佈(0-1分佈,兩點分佈)

  • input:概率值