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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

PyTorch 笔记(10)— Tensor 与 NumPy 相互转换、两种共享内存以及两者的广播法则

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch 笔记(10)— Tensor 与 NumPy 相互转换、两种共享内存以及两者的广播法则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TensorNumPy 有很高的相似性,彼此之間的互操作也非常簡單有效,需要注意的是 TensorNumPy 共享內存,由于 NumPy 歷史悠久,所以遇到 Tensor 不支持的操作時,可以先轉換成 NumPy ,處理后再轉換成 Tensor,轉換開銷很小。

1. Tensor 轉化為 NumPy

In [1]: import torch as tIn [2]: a = t.ones(5)In [3]: a
Out[3]: tensor([1., 1., 1., 1., 1.])In [4]: b = a.numpy()In [5]: b
Out[5]: array([1., 1., 1., 1., 1.], dtype=float32)

2. NumPy 轉化為 Tensor

In [6]: import numpy as npIn [7]: a = np.ones(5)In [8]: a
Out[8]: array([1., 1., 1., 1., 1.])In [9]: b =t.from_numpy(a)In [10]: b
Out[10]: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

值得注意的是,Torch 中的 TensorNumPy 中的 Array 共享內存位置,一個改變,另一個也同樣改變。注意使用的是 b.add_()

In [10]: b
Out[10]: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)In [11]: b.add_(1)
Out[11]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)In [12]: a
Out[12]: array([2., 2., 2., 2., 2.])In [13]: b
Out[13]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

下面看使用 b.add() 發現 b 并沒有改變。

In [13]: b
Out[13]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)In [14]: b.add(2)
Out[14]: tensor([4., 4., 4., 4., 4.], dtype=torch.float64)In [15]: a
Out[15]: array([2., 2., 2., 2., 2.])In [16]: b
Out[16]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

b.add_()b.add() 的區別

任何操作符都固定地在前面加上 _ 來表示替換。例如:y.copy_(x)y.t_(),都將改變 y

3. PyTorch 廣播法則

當輸入數組的某個維度的長度為 1 時,計算時沿此維度復制擴充成一樣的形狀。

可以通過以下兩個函數組合手動實現廣播法則:

  • unsqueeze 或者 view : 為數據的某一維的形狀補 1,實現法則 1
  • expand 或者 expand_as ,重復數組,實現法則 3;該操作不會復制數組,所以不會占用額外空間

注意: repeat 實現和 expand 相類似的功能,但是 repeat 會把形同的數據復制多份,因此會占用額外的空間。

3.1 自動廣播法則

In [17]: a = t.ones(3,2)In [18]: a
Out[18]: 
tensor([[1., 1.],[1., 1.],[1., 1.]])In [19]: b = t.zeros(2,3,1)In [20]: b
Out[20]: 
tensor([[[0.],[0.],[0.]],[[0.],[0.],[0.]]])

可以看到 a 是二維的,而 b 是三維的,但是可以通過廣播法則直接進行相加計算。

In [23]: a + b
Out[23]: 
tensor([[[1., 1.],[1., 1.],[1., 1.]],[[1., 1.],[1., 1.],[1., 1.]]])In [24]: 

3.2 手動廣播法則

In [24]: a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2)
Out[24]: 
tensor([[[1., 1.],[1., 1.],[1., 1.]],[[1., 1.],[1., 1.],[1., 1.]]])In [25]: 

4. Numpy 廣播法則

  • 讓所有輸入數組都向其中 shape 最長的數組看齊,shape 中不足的部分可通過在前面加 1 補齊;
  • 兩個數組要么在某一維度的長度一致,要么其中一個為 1,否則不能計算;

總結

以上是生活随笔為你收集整理的PyTorch 笔记(10)— Tensor 与 NumPy 相互转换、两种共享内存以及两者的广播法则的全部內容,希望文章能夠幫你解決所遇到的問題。

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