Pytorch入坑之Tensor大詳解

導語

深度學習框架Pytorch發展勢頭驚人,這點小編也深有體會,翻翻Github上深度學習的開源代碼,發現用Pytorch真的多了很多,因此小編最近也正在入坑Pytorch,順便寫寫文章作些總結。認真看完這篇文章,你將收穫:python

  • 理解Tensor的建立
  • 理解Tensor的加速
  • 理解Tensor的經常使用屬性
  • 理解Tensor的經常使用方法

Tensor建立

咱們應該都知道Numpy是支持大量維度數組與矩陣運算的經常使用擴展庫。可是對於計算圖,深度學習或者梯度,Numpy彷佛真的有心無力,由於它的計算沒法像Tensor同樣在GPU上加速。今天咱們就一塊兒來談談Pytorch最基本的概念Tensor。數組

Tensor是n維的數組,在概念上與numpy數組是同樣的,不一樣的是Tensor能夠跟蹤計算圖和計算梯度。框架

1.從Numpy中建立函數

import torch
import numpy as np

numpy_array= np.array([1,2,3])
torch_tensor1 = torch.from_numpy(numpy_array)
torch_tensor2 = torch.Tensor(numpy_array)
torch_tensor3 = torch.tensor(numpy_array)

值得注意的是torch.Tensor()是默認張量類型torch.FloatTensor()的別名,就是說返回torch.Tensor()返回的是Float數據類型。其實咱們也能夠修改其默認的數據類型:學習

torch.set_default_tensor_type(torch.DoubleTensor)

而torch.tensor()則會根據輸入數據類型生成相應的torch.LongTensor、torch.FloatTensor和torch.DoubleTensor。code

固然,咱們也能夠經過numpy()把Tensor轉換爲numpy類型內存

numpy_array = torch_tensor1.numpy() # 若是tensor在CPU上
numpy_array = torch_tensor1.cpu.numpy() # 若是tensor在GPU上
print(type(numpy_array)) #輸出 : <class 'numpy.ndarray'>

注意,若是Tensor在GPU上,則須要使用.cpu()先將GPU的Tensor轉換到cpu上。深度學習

2.從Python內置類型中建立it

lst = [1,2,3]
torch_tensor1 = torch.tensor(a)
tp = (1,2,3)
torch_tensor2  = torch.tensor(a1)

3.其餘方式class

# 建立相同元素的Tensor
torch_tensor1  = torch.full([2,3],2)
# 建立全爲1的Tensor
torch_tensor2 = torch.ones([2,3])
# 建立全爲0的Tensor
torch_tensor3 = torch.zeors([2,3])
# 建立對角陣的Tensor
torch_tensor4  = torch.eye(3)
# 在區間[1,10]中隨機建立Tensor
torch_tensor5 = torch.randint(1,10,[2,2])
# 等等...

建立Tensor時候也可指定數據類型和所存儲的設備

torch_tensor= torch.zeros([2,3],dtype=torch.float64,device=torch.device('cuda:0'))
torch_tensor.dtype #torch.float64
torch_tensor.device #cuda:0
torch_tensor.is_cuda #True

Tensor加速

咱們可使用如下兩種方式使得Tensor在GPU上加速。

第一種方式是定義cuda數據類型。

dtype = torch.cuda.FloatTensor
gpu_tensor = torch.randn(1,2).type(dtype) #把Tensor轉換爲cuda數據類型

第二種方式是直接將Tensor放到GPU上(推薦)。

gpu_tensor = torch.randn(1,2).cuda(0)#把Tensor直接放在第一個GPU上
gpu_tensor = torch.randn(1,2).cuda(1)#把Tensor直接放在第二個GPU上

而將Tensor放在CPU上也很簡單。

cpu_tensor = gpu_tensor.cpu()

Tensor經常使用屬性

1.查看Tensor類型屬性

tensor1 = torch.ones([2,3])
tensor1.dtype # torch.float32

2.查看Tensor尺寸屬性

tensor1.shape # 尺寸
tenosr1.ndim #維度

3.查看Tensor是否存儲在GPU上

tensor1.is_cuda #False

4.查看Tensor存儲設備

tensor1.device # cpu
tensor1.cuda(0)
tensor1.device # cuda:0

5.查看Tensor梯度計算

tensor1.grad

Tensor經常使用方法

1.torch.squeeze():刪除值爲1的維度並返回Tensor

tensor1 = torch.ones([2,1,3])
torch_tensor1.size() #torch.Size([2, 1, 3])
tensor2=torch.squeeze(tensor1)
print(tensor2.size())#torch.Size([2, 3])

從例子中能夠看到Tensor的維度從原來的[2,1,3]變成[2,3],值爲1的維度被刪除。

2.torch.Tensor.permute()置換Tensor維度並返回新視圖。

tensor1 = torch.ones([2,1,3])
print(tensor1.size()) # torch.Size([2, 1, 3])
tensor2 = tensor1.permute(2,1,0) # 0,1,2-> 2,1,0
print(tensor2.size()) # torch.Size([3, 1, 2])

從例子中能夠看到,Tensor將本來的第一個維度值爲2,第2維度值爲3,置換後分別變成3和2.

3.torch.Tensor.expand():把值爲1的維度進行擴展,擴展的Tensor不會分配新的內存,只是原來的基礎上建立新的視圖並返回。

>>>tensor1 = torch.tensor([[3],[2]])
>>>tensor2 = tensor1.expand(2,2)
>>>tensor1.size()
torch.Size([2, 1])
>>>tensor2
tensor([[3, 3],
        [2, 2]])
>>>tensor2.size()
torch.Size([2, 2])

從例子中能夠看到,本來Tensor的維度是(2,1),由於該函數是對值爲1的維度進行擴展,因此能夠擴展爲(2,2),(2,3)等,可是要注意的是保持非1值的維度不變。

4.torch.Tensor.repeat():沿着某個維度的Tensor進行重複,和expand()不一樣的是,該函數複製本來的數據。

>>>tensor1 = torch.tensor([[3],[2]])
>>>tensor1.size()
torch.Size([2, 1])
>>>tensor2=tensor1.repeat(4,2)
>>>tensor2.size()
torch.Size([8, 2])
>>>tensor2
tensor([[3, 3],
        [2, 2],
        [3, 3],
        [2, 2],
        [3, 3],
        [2, 2],
        [3, 3],
        [2, 2]])

例子中的tensor1維度是(2,1),tensor1.repeat(4,2),這是對第0維度和第1維度的Tensor分別重複4次和2次,因此repeat後維度變成了(8,2)。再看下面的例子。

>>>tensor1 = torch.tensor([[2,1]])
>>>tensor1.size()
torch.Size([1, 2])
>>>tensor2=tensor1.repeat(2,2,1)
>>>tensor2.size()
torch.Size([2,2,2])
>>>tensor2
tensor([[[2, 1],
         [2, 1]],

        [[2, 1],
         [2, 1]]])

例子中的tensor1維度是(1,2),tensor1.repeat(2,2,1),此時前者跟後者的維度對應不上,此時能夠理解爲tensor1把維度改寫爲(1,1,2),再tensor1.repeat(2,2,1),tensor1第0,1,2的維度的Tensor分別重複1次,1次,2次,repeat後Tensor維度爲(2,2,2)。

公衆號:CVpython,專一於分享Python和計算機視覺,咱們堅持原創,不按期更新,但願文章對你有幫助,快點掃碼關注吧。

相關文章
相關標籤/搜索