張量操作與線性迴歸
目錄
張量的操作:
-
拼接:
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())