1 Tensor的裁剪运算
- 常用于梯度裁剪(gradient clipping),即在发生梯度离散或者梯度爆炸时对梯度的处理
- torch.clamp(input, min, max, out=None) → Tensor:将输入
input
张量每个元素的夹紧到区间 [min,max],并返回结果到一个新张量。
2 Tensor的索引与数据筛选
- torch.where(codition,x,y):按照条件从x和y中选出满足条件的元素组成新的tensor,输入参数condition:条件限制,如果满足条件,则选择a,否则选择b作为输出。
- torch.gather(input,dim,index,out=None):在指定维度上按照索引赋值输出tensor
- torch.inex_select(input,dim,index,out=None):按照指定索引赋值输出tensor
- torch.masked_select(input,mask,out=None):按照mask输出tensor,输出为向量
- torch.take(input,indices):将输入看成1D-tensor,按照索引得到输出tensor
-
torch.nonzero(input,out=None):输出非0元素的坐标
import torch
#torch.where
a = torch.rand(4, 4)
b = torch.rand(4, 4)
print(a)
print(b)
out = torch.where(a > 0.5, a, b)
print(out)
print("torch.index_select")
a = torch.rand(4, 4)
print(a)
out = torch.index_select(a, dim=0,
index=torch.tensor([0, 3, 2]))
#dim=0按列,index取的是行
print(out, out.shape)
print("torch.gather")
a = torch.linspace(1, 16, 16).view(4, 4)
print(a)
out = torch.gather(a, dim=0,
index=torch.tensor([[0, 1, 1, 1],
[0, 1, 2, 2],
[0, 1, 3, 3]]))
print(out)
print(out.shape)
#注:从0开始,第0列的第0个,第一列的第1个,第二列的第1个,第三列的第1个,,,以此类推
#dim=0, out[i, j, k] = input[index[i, j, k], j, k]
#dim=1, out[i, j, k] = input[i, index[i, j, k], k]
#dim=2, out[i, j, k] = input[i, j, index[i, j, k]]
print("torch.masked_index")
a = torch.linspace(1, 16, 16).view(4, 4)
mask = torch.gt(a, 8)
print(a)
print(mask)
out = torch.masked_select(a, mask)
print(out)
print("torch.take")
a = torch.linspace(1, 16, 16).view(4, 4)
b = torch.take(a, index=torch.tensor([0, 15, 13, 10]))
print(b)
#torch.nonzero
print("torch.take")
a = torch.tensor([[0, 1, 2, 0], [2, 3, 0, 1]])
out = torch.nonzero(a)
print(out)
#稀疏表示
3 Tensor的组合/拼接
- torch.cat(seq,dim=0,out=None):按照已经存在的维度进行拼接
- torch.stack(seq,dim=0,out=None):沿着一个新维度对输入张量序列进行连接。序列中所有的张量都应该为相同形状。
print("torch.stack")
a = torch.linspace(1, 6, 6).view(2, 3)
b = torch.linspace(7, 12, 6).view(2, 3)
print(a, b)
out = torch.stack((a, b), dim=2)
print(out)
print(out.shape)
print(out[:, :, 0])
print(out[:, :, 1])
4 Tensor的切片
- torch.chunk(tensor,chunks,dim=0):按照某个维度平均分块(最后一个可能小于平均值)
- torch.split(tensor,split_size_or_sections,dim=0):按照某个维度依照第二个参数给出的list或者int进行分割tensor
5 Tensor的变形操作
- torch().reshape(input,shape)
- torch().t(input):只针对2D tensor转置
- torch().transpose(input,dim0,dim1):交换两个维度
- torch().squeeze(input,dim=None,out=None):去除那些维度大小为1的维度
- torch().unbind(tensor,dim=0):去除某个维度
- torch().unsqueeze(input,dim,out=None):在指定位置添加维度,dim=-1在最后添加
- torch().flip(input,dims):按照给定维度翻转张量
- torch().rot90(input,k,dims):按照指定维度和旋转次数进行张量旋转
import torch
a = torch.rand(2, 3)
print(a)
out = torch.reshape(a, (3, 2))
print(out)
print(a)
print(torch.flip(a, dims=[2, 1]))
print(a)
print(a.shape)
out = torch.rot90(a, -1, dims=[0, 2]) #顺时针旋转90°
print(out)
print(out.shape)
6 Tensor的填充操作
7 Tensor的频谱操作(傅里叶变换)
独家重磅课程!
1、深度学习三维重建 详解深度学习三维重建网络:MVSNet、PatchMatchNet、JDACS-MS
2、三维视觉基础 详解视觉深度估计算法(单/双目/RGB-D+特征匹配+极线矫正+代码实战)
3、视觉SLAM必备基础 详解视觉SLAM核心:地图初始化、实时跟踪、局部建图、回环检测、BA优化,工程技巧
4、 VINS:Mono+Fusion SLAM面试官:看你简历上写精通VINS,麻烦现场手推一下预积分!
5、VIO进阶:ORB-SLAM3(单/双目/RGBD+鱼眼+IMU紧耦合+多地图+闭环)独家70+讲全部上线!
6、图像三维重建课程:视觉几何三维重建教程(第2期):稠密重建,曲面重建,点云融合,纹理贴图
7、重磅来袭!基于LiDAR的多传感器融合SLAM 系列教程:LOAM、LeGO-LOAM、LIO-SAM
8、系统全面的相机标定课程:单目/鱼眼/双目/阵列 相机标定:原理与实战
全国最棒的SLAM、三维视觉学习社区↓
技术交流微信群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群,请添加微信号 chichui502 或扫描下方加群,备注:”名字/昵称+学校/公司+研究方向“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
投稿、合作也欢迎联系:simiter@126.com
扫描关注视频号,看最新技术落地及开源方案视频秀 ↓
— 版权声明 —
本公众号原创内容版权属计算机视觉life所有;从公开渠道收集、整理及授权转载的非原创文字、图片和音视频资料,版权属原作者。如果侵权,请联系我们,会及时删除。