【相關推薦:Python3影片教學 】
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 視圖, 並定義了數值操作。
Torch 定義了七種CPU tensor 類型和八個GPU tensor 類型:
torch. Tensor
是預設的tensor 類型(torch.FloatTensor
)的簡稱,即32
位元浮點數資料型別。
Tensor 的屬性
Tensor 有許多屬性,包括資料型態、Tensor 的維度、Tensor 的尺寸。
範例程式碼如下:
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)
程式輸出結果如下:
contiguous)的tensor 進行操作,而reshape( ) 同時也可以對不符合連續性條件的tensor 進行操作。在滿足tensor 連續性條件(
contiguous)時,a.reshape() 傳回的結果與a.view() 相同,都不會開啟新記憶體空間;不滿足
contiguous時, 直接使用view() 方法會失敗,
reshape() 仍然有用,但是會重新開闢內存空間,不與之前的tensor 共享內存,即返回的是
”副本“(等價於先呼叫contiguous() 方法再使用
view() 方法)。
更多理解參考這篇文章
.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'> """
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 ,可以传入数据或者维度,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.]])
【相关推荐:Python3视频教程 】
以上是實例詳解Pytorch中的tensor資料結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!