Torch和Numpy的相爱相杀日记——手搓模型中常用内置函数使用记录

一、Torch

        1.torch.from_numpy()

        将自己的数据格式转为 torch.tensor 时,一种常用的思路是将数据先转为 numpy 格式,在通过上述函数转为 tensor 。一个例子是将 list 转为 torch 数据格式。

        函数传入: 一个numpy数据array格式

import numpy as np
import torch

# 初始list数据
List = [[0,1],[2,3],[4,5]]
# 转为numpy
num_list = np.array(List)
# 转为torch
torch_list = torch.from_numpy(num_list)

        2. torch.repeat()

         有时需要对一些输出结果进行遍历操作,如对样本批次的锚框对每一个边缘框做IoU计算——一种做法是将边缘框复制锚框的样本数量份,这样就可以批量计算不同样本的锚框对于同一个边缘框的IoU。上述涉及到对 tensor 某一纬度的复制

        函数传入:指定需要复制纬度的复制数量(第几个数代表复制第几维度)

import torch
test = torch.tensor([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(test, test.shape)
# 复制矩阵第一纬度
output_1 = test.repeat(1,3).reshape(4,3,3)
print(output_1, output_1.shape)
# 复制矩阵第二纬度
output_2 = test.repeat(3,1).reshape(3,4,3)
print(output_2, output_2.shape)

## 结果展示
tensor([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]) 
torch.Size([4, 3])

tensor([[[ 0,  1,  2], [ 0,  1,  2], [ 0,  1,  2]],
        [[ 3,  4,  5], [ 3,  4,  5], [ 3,  4,  5]],
        [[ 6,  7,  8], [ 6,  7,  8], [ 6,  7,  8]],
        [[ 9, 10, 11], [ 9, 10, 11], [ 9, 10, 11]]]) 
torch.Size([4, 3, 3])

tensor([[[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8],
         [ 9, 10, 11]],

        [[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8],
         [ 9, 10, 11]],

        [[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8],
         [ 9, 10, 11]]]) 
torch.Size([3, 4, 3])

        3.torch.where()

        想要“删除” torch.tensor 中的一些指定值的数时,tensor 是不支持直接删除的,因为 tensor 形状已经固定。可以使用 torch.where 函数将指定值换成别的数。

         函数传入:1.一个布尔列表tensor,判断元素是否等于指定值

                           2.替换值(tensor格式)

                           3.原始的 tensor

import torch
# 替换元素值5到0
test1 = torch.tensor([1,2,3,4,5,6,7,8,9])
test_replaced1 = torch.where(test1 == 5, torch.tensor(0), test1)
print(test1, test_replaced1)

test2 = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
test_replaced2 = torch.where(test2 == 5, torch.tensor(0), test2)
print(test2, test_replaced2)

## 结果
tensor([1, 2, 3, 4, 5, 6, 7, 8, 9]) tensor([1, 2, 3, 4, 0, 6, 7, 8, 9])

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]) 
tensor([[1, 2, 3],
        [4, 0, 6],
        [7, 8, 9]])

二、Numpy

        1.np.pad()

        在目标检测任务的训练集加载器构建中,对于一张图片可能的框是随机个数时,我们需要将每张图片框的个数统一标准化,以方便模型训练读取数据。

        一种可能的做法是选择图片中框数最大值为标准,不够的填充 0 补齐形状大小,此时可以使用 numpy 自带的库函数实现:对于特定维度填充数的操作

        函数传入:1.原始数据;

                          2.在哪一维度(对应于padding列表中的第几个元组)的前面还是后面(对应于元组的第一第二个数)填充多少个数(对应元组数值);

                          3.填充模式;

                          4.填入什么数(此处为填充0)。

import numpy as np

# 测试原始数据
test = np.array([1,2,3,4,5,6,7,8,9]).reshape(1,3,3)
print(test)
# 标准化期望填充到的维度
max_shape = 5
# 在第二个维度进行填充操作
pad_width = max_shape - test.shape[1]
padding = [(0,0),(0,pad_width),(0,0)]
padded_test = np.pad(test,pad_width=padding,mode='constant', constant_values=0)
print(padded_test)

## 结果展示
# 原始数据
[[[1 2 3]
  [4 5 6]
  [7 8 9]]]
# 填充操作后数据
[[[1 2 3]
  [4 5 6]
  [7 8 9]
  [0 0 0]
  [0 0 0]]]

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值