中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pytorch中的tensor數據結構實例代碼分析

發布時間:2022-09-14 17:58:55 來源:億速云 閱讀:158 作者:iii 欄目:編程語言

這篇文章主要介紹了Pytorch中的tensor數據結構實例代碼分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Pytorch中的tensor數據結構實例代碼分析文章都會有所收獲,下面我們一起來看看吧。

torch.Tensor

torch.Tensor 是一種包含單一數據類型元素的多維矩陣,類似于 numpy 的 array
Tensor 可以使用 torch.tensor() 轉換 Python 的 list 或序列數據生成,生成的是dtype 默認是 torch.FloatTensor

注意 torch.tensor() 總是拷貝 data。如果你有一個 Tensor data 并且僅僅想改變它的 requires_grad 屬性,可用 requires_grad_() 或者 detach() 來避免拷貝。如果你有一個 numpy 數組并且想避免拷貝,請使用 torch.as_tensor()

1,指定數據類型的 Tensor 可以通過傳遞參數 torch.dtype 和/或者 torch.device 到構造函數生成:

注意為了改變已有的 tensor 的 torch.device 和/或者 torch.dtype, 考慮使用 to() 方法.

>>> torch.ones([2,3], dtype=torch.float64, device="cuda:0")
tensor([[1., 1., 1.],
        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
>>> torch.ones([2,3], dtype=torch.float32)
tensor([[1., 1., 1.],
        [1., 1., 1.]])

2,Tensor 的內容可以通過 Python索引或者切片訪問以及修改:

>>> matrix = torch.tensor([[2,3,4],[5,6,7]])
>>> print(matrix[1][2])
tensor(7)
>>> matrix[1][2] = 9
>>> print(matrix)
tensor([[2, 3, 4],
        [5, 6, 9]])

3,使用 torch.Tensor.item() 或者 int() 方法從只有一個值的 Tensor中獲取 Python Number:

>>> x = torch.tensor([[4.5]])
>>> x
tensor([[4.5000]])
>>> x.item()
4.5
>>> int(x)
4

4,Tensor可以通過參數 requires_grad=True 創建, 這樣 torch.autograd 會記錄相關的運算實現自動求導:

>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
>>> out = x.pow(2).sum()
>>> out.backward()
>>> x.grad
tensor([[ 2.0000, -2.0000],
 [ 2.0000,  2.0000]])

5,每一個 tensor都有一個相應的 torch.Storage 保存其數據。tensor 類提供了一個多維的、strided 視圖, 并定義了數值操作。

Tensor 數據類型

Torch 定義了七種 CPU tensor 類型和八種 GPU tensor 類型:

Pytorch中的tensor數據結構實例代碼分析

torch.Tensor 是默認的 tensor 類型(torch.FloatTensor)的簡稱,即 32 位浮點數數據類型。

Tensor 的屬性

Tensor 有很多屬性,包括數據類型、Tensor 的維度、Tensor 的尺寸。

  • 數據類型:可通過改變 torch.tensor() 方法的 dtype 參數值,來設定不同的 tensor 數據類型。

  • 維度:不同類型的數據可以用不同維度(dimension)的張量來表示。標量為 0 維張量,向量為 1 維張量,矩陣為 2 維張量。彩色圖像有 rgb 三個通道,可以表示為 3 維張量。視頻還有時間維,可以表示為 4 維張量,有幾個中括號 [ 維度就是幾。可使用 dim() 方法 獲取 tensor 的維度。

  • 尺寸:可以使用 shape屬性或者 size()方法查看張量在每一維的長度,可以使用 view()方法或者reshape() 方法改變張量的尺寸。

樣例代碼如下:

matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]],
                       [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64)
print(matrix)               # 打印 tensor
print(matrix.dtype)     # 打印 tensor 數據類型
print(matrix.dim())     # 打印 tensor 維度
print(matrix.size())     # 打印 tensor 尺寸
print(matrix.shape)    # 打印 tensor 尺寸
matrix2 = matrix.view(4, 2, 2) # 改變 tensor 尺寸
print(matrix2)

程序輸出結果如下:

Pytorch中的tensor數據結構實例代碼分析

view 和 reshape 的區別

兩個方法都是用來改變 tensor 的 shape,view() 只適合對滿足連續性條件(contiguous)的 tensor 進行操作,而 reshape() 同時還可以對不滿足連續性條件的 tensor 進行操作。在滿足 tensor 連續性條件(contiguous)時,a.reshape() 返回的結果與a.view() 相同,都不會開辟新內存空間;不滿足 contiguous 時, 直接使用 view() 方法會失敗,reshape() 依然有用,但是會重新開辟內存空間,不與之前的 tensor 共享內存,即返回的是 ”副本“(等價于先調用 contiguous() 方法再使用 view() 方法)。
更多理解參考這篇文章

Tensor 與 ndarray

1,張量和 numpy 數組。可以用 .numpy() 方法從 Tensor 得到 numpy 數組,也可以用 torch.from_numpy 從 numpy 數組得到Tensor。這兩種方法關聯的 Tensor 和 numpy 數組是共享數據內存的。可以用張量的 clone方法拷貝張量,中斷這種關聯。

arr = np.random.rand(4,5)
print(type(arr))
tensor1 = torch.from_numpy(arr)
print(type(tensor1))
arr1 = tensor1.numpy()
print(type(arr1))
"""
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
<class 'numpy.ndarray'>
"""

2,item() 方法和 tolist() 方法可以將張量轉換成 Python 數值和數值列表

# item方法和tolist方法可以將張量轉換成Python數值和數值列表
scalar = torch.tensor(5)  # 標量
s = scalar.item()
print(s)
print(type(s))

tensor = torch.rand(3,2)  # 矩陣
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class 'float'>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class 'list'>
"""

創建 Tensor

創建 tensor ,可以傳入數據或者維度,torch.tensor() 方法只能傳入數據,torch.Tensor() 方法既可以傳入數據也可以傳維度,強烈建議 tensor() 傳數據,Tensor() 傳維度,否則易搞混。

傳入維度的方法

方法名方法功能備注
torch.rand(*sizes, out=None) → Tensor返回一個張量,包含了從區間 [0, 1)均勻分布中抽取的一組隨機數。張量的形狀由參數sizes定義。推薦
torch.randn(*sizes, out=None) → Tensor返回一個張量,包含了從標準正態分布(均值為0,方差為1,即高斯白噪聲)中抽取的一組隨機數。張量的形狀由參數sizes定義。不推薦
torch.normal(means, std, out=None) → Tensor返回一個張量,包含了從指定均值 means 和標準差 std 的離散正態分布中抽取的一組隨機數。標準差 std 是一個張量,包含每個輸出元素相關的正態分布標準差。多種形式,建議看源碼
torch.rand_like(a)根據數據 a 的 shape 來生成隨機數據不常用
torch.randint(low=0, high, size)生成指定范圍(low, hight)和 size 的隨機整數數據常用
torch.full([2, 2], 4)生成給定維度,全部數據相等的數據不常用
torch.arange(start=0, end, step=1, *, out=None)生成指定間隔的數據易用常用
torch.ones(*size, *, out=None)生成給定 size 且值全為1 的矩陣數據簡單
zeros()/zeros_like()/eye()0 的 tensor 和 對角矩陣簡單

樣例代碼:

>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

關于“Pytorch中的tensor數據結構實例代碼分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Pytorch中的tensor數據結構實例代碼分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定襄县| 云和县| 姚安县| 安泽县| 绥中县| 陇西县| 南溪县| 安乡县| 罗源县| 柯坪县| 涟源市| 临城县| 微山县| 墨竹工卡县| 濉溪县| 合江县| 特克斯县| 西宁市| 东乌珠穆沁旗| 长宁县| 布拖县| 扬州市| 横峰县| 即墨市| 台州市| 杨浦区| 临安市| 铁力市| 专栏| 中宁县| 孟津县| 丰城市| 高阳县| 酉阳| 弥渡县| 浙江省| 安龙县| 上虞市| 新津县| 兰坪| 普陀区|