Pytorch(二)

                   張量操作與線性迴歸

目錄

張量的操作:

拼接:

 torch.cat()

 torch.stack()

切分:

torch.chunk()

torch.split()

索引:

torch.index_select()

torch.masked_select()

變換:

torch.reshape()

torch.transpose()

torch.t()

torch.squeeze()

torch.unsqueeze()


張量的操作:

  • 拼接:

  •  torch.cat()

功能:將張量按維度dim進行拼接

成員變量:

  • tensors:張量序列 
Union[Tuple[Tensor, ...], List[Tensor]]
  • dim:要拼接的維度
torch.cat()
  •  torch.stack()

功能:在新創建的維度dim進行拼接

成員變量:

  • tensors:張量序列
  • dim:要拼接的維度

 例程:

import torch
import numpy as np

n=np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6]],dtype=int)
t=torch.tensor(n,device="cuda",requires_grad=False)
t_cat_0=torch.cat([t,t],dim=0)
t_cat_1=torch.cat([t,t],dim=1)
t_stack_0=torch.stack([t,t],dim=0)
t_stack_1=torch.stack([t,t],dim=1)
print("tensor: ",t)
print("tensor_cat_0: ",t_cat_0)
print("tensor_cat_1: ",t_cat_1)
print("tensor_stack_0: ",t_stack_0)
print("tensor_stack_1: ",t_stack_1)

結果:

注意:cat()不會擴展張量的維度,而stack()會拓展張量的維度。

  • 切分:

  • torch.chunk()

功能:將張量按維度dim進行平均切分。

返回值:張量列表

成員變量:

  • input:要切分的張量
  • chunks:要切分的份數
  • dim:要切分的維度

注意事項:若不能整除,最後一項張量小於其他張量 

t_chunk=torch.chunk(t,2,1)

print("tensor _chunk: ",t_chunk)

t_chunk=torch.chunk(t,2,1)
for chunk in t_chunk:
    print("tensor _chunk: ",chunk)

  • torch.split()

功能:將張量按維度dim進行切分。

返回值:張量列表

成員變量:

  • tensor:要切分的張量
  • split_size_or_sections:爲int時,表示每一份的長度;爲list時,按list元素切分
  • dim:要切分的維度

實現:

t_split=torch.split(t,2,1)
for split in t_split:
    print("tensor _split: ", split)

t_split_list=torch.split(t,[1,3],1)
for split in t_split_list:
    print("tensor _split_list: ", split)

注意:如果使用list作爲參數,則元素總和等於切分前的數量。

  • 索引:

  • torch.index_select()

功能:在維度dim上,按index索引數據

返回值:依index索引數據拼接的張量

成員變量:

  • input:要索引的張量
  • dim:要切分的維度
  • index:要索引數據的序號

實現:

x = torch.randn(3, 4)		# 目標矩陣
indices = torch.tensor([0, 2],dtype=torch.long)	# 在軸上篩選座標
t_index_select_0=torch.index_select(x, dim=0, index=indices)	# 指定篩選對象、軸、篩選座標

t_index_select_1=torch.index_select(x, dim=1, index=indices)
print("tensor: ",x);
print("tensor_0: ",t_index_select_0)
print("tensor_1: ",t_index_select_1)

  • torch.masked_select()

功能:按mask中的true進行索引

返回值:一維張量

成員變量:

  • input:要索引的張量
  • mask:與input同形狀的布爾類型張量

實現:

print("tensor: ",t)
mask=t.ge(5)
print("mask: ",mask)
t_mask_select=torch.masked_select(t,mask=mask)
print("t_mask_select: ",t_mask_select)

  • 變換:

  • torch.reshape()

功能:變換張量形狀

注意事項:當張量在內存中是連續時,新張量與input共享數據內存

成員變量:

  • input:要變換的張量
  • shape:新張量的形狀

實現:

t_reshape=torch.reshape(t,[-1,2])
print("t_reshape: ",t_reshape)

注意:[-1,2]中的-1表示我們不關心的維度,由系統決定。

  • torch.transpose()

功能:交換張量的兩個維度

成員變量:

  • input:要變換的張量
  • dim0:要交換的維度
  • dim1:要交換的維度

實現:

d=torch.randint(5,(2,3,3))
print("t: ",d)
t_transpose=torch.transpose(d,dim0=0,dim1=1)
print("t_transpose: ",t_transpose)

  • torch.t()

功能:2維張量裝置,對矩陣而言等價於torch.transpose(input,0,1)

成員變量:

  • input:要變換的張量

實現:

t_transpose=torch.t(t)
print("t_transpose: ",t_transpose)

 

  • torch.squeeze()

功能:壓縮長度爲1的維度(軸)

成員變量:

  • dim:若爲None,移除所有長度1的軸;若指定維度,當且僅當該軸長度爲1時,可以被移除;

實現:

t1=torch.rand((1,2,3))
print("t1: ",t1)
print("t1.size:",t1.size())
t1_sq=torch.squeeze(t1)
print("t1_sq: ",t1_sq)
print("t1_sq.size: ",t1_sq.size())

 

  • torch.unsqueeze()

功能:y依據dim擴展維度

成員變量:

  • dim:擴展的維度

實現:

t1=torch.rand((1,2,3))
print("t1: ",t1)
print("t1.size:",t1.size())
t1_sq=torch.squeeze(t1)
print("t1_sq: ",t1_sq)
print("t1_sq.size: ",t1_sq.size())
t1_usq=torch.unsqueeze(t1_sq,0)
print("t1_usq.size: ",t1_usq.size())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章