日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch tensor_[PyTorch 学习笔记] 1.2 Tensor(张量)介绍

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 True

torch.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。
    代碼示例:
    # 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 為張量,std 為標量
    代碼示例:# 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:張量 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(张量)介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。