栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

43、python的permute转换维度数据转c++去处理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

43、python的permute转换维度数据转c++去处理

基本思想:需要使用c++将permute维度的数据转成c++进行后处理,所以记录一下

permute转化数据还是比较麻烦的,先将其写法写成transpose,然后在进行改写简单的循环形式

首先我将原始数据拉伸成一维数组进行预先存起来,这里做了简单测试和记录,其实很简单

#pred_bbox 1,255,17,17
#nA=3 nH 17 nW 17
#pred_bbox.view(nA, -1, nH, nW).permute(0, 2, 3, 1).contiguous()  转 c++
import torch
dim_0=1
dim_1=6
dim_2=2
dim_3=2
pred_bbox=torch.arange(0,dim_0*dim_1*dim_2*dim_3)
xx = pred_bbox.view(3, -1, dim_2, dim_3)     # 3 85 17 17
dim_0=xx.size(0)
dim_1=xx.size(1)
dim_2=xx.size(2)
dim_3=xx.size(3)
print("xx=",xx)
yy = xx.transpose(1, 2).contiguous() #3 17 85 17
print("yy=",yy)
zz = yy.transpose(2, 3).contiguous()  # 3 17 17 85
print("zz=",zz)

########  完成了维度 transpose_1_2
a=[]
for idx in range(0,dim_0*dim_1*dim_2*dim_3):
    a.append(idx)

c=[]
for z in range(0,dim_0):
    for y in range(0, dim_2):
        for x in range(0,dim_1):
            for t in range(0,dim_3):
                c.append(a[z*dim_1*dim_2*dim_3+x*dim_2*dim_3+y*dim_2+t])
print(c)
########## c对应的 yy
print("cc---yy")
#########
d=[]
for z in range(0,dim_0):
    for y in range(0, dim_2):
        for x in range(0, dim_3):
            for t in range(0, dim_1):
                d.append(c[z*dim_1*dim_2*dim_3+x+y*dim_3*dim_1+t*dim_2])
print(d)
########## d对应的 zz
print("zz=d")

测试结果

/usr/bin/python3.8 /home/ubuntu/PycharmProjects/pythonProject1/test.py
xx= tensor([[[[ 0,  1],
          [ 2,  3]],

         [[ 4,  5],
          [ 6,  7]]],


        [[[ 8,  9],
          [10, 11]],

         [[12, 13],
          [14, 15]]],


        [[[16, 17],
          [18, 19]],

         [[20, 21],
          [22, 23]]]])
yy= tensor([[[[ 0,  1],
          [ 4,  5]],

         [[ 2,  3],
          [ 6,  7]]],


        [[[ 8,  9],
          [12, 13]],

         [[10, 11],
          [14, 15]]],


        [[[16, 17],
          [20, 21]],

         [[18, 19],
          [22, 23]]]])
zz= tensor([[[[ 0,  4],
          [ 1,  5]],

         [[ 2,  6],
          [ 3,  7]]],


        [[[ 8, 12],
          [ 9, 13]],

         [[10, 14],
          [11, 15]]],


        [[[16, 20],
          [17, 21]],

         [[18, 22],
          [19, 23]]]])
[0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15, 16, 17, 20, 21, 18, 19, 22, 23]
cc---yy
[0, 4, 1, 5, 2, 6, 3, 7, 8, 12, 9, 13, 10, 14, 11, 15, 16, 20, 17, 21, 18, 22, 19, 23]
zz=d

Process finished with exit code 0

实际代码中的测试实数据

#pred_bbox 1,255,17,17
#nA=3 nH 17 nW 17
#pred_bbox.view(nA, -1, nH, nW).permute(0, 2, 3, 1).contiguous()  转 c++
import torch
dim_0=1
dim_1=255
dim_2=17
dim_3=17
pred_bbox=torch.arange(0,dim_0*dim_1*dim_2*dim_3)
xx = pred_bbox.view(3, -1, dim_2, dim_3)     # 3 85 17 17
dim_0=xx.size(0)
dim_1=xx.size(1)
dim_2=xx.size(2)
dim_3=xx.size(3)
print("xx=",xx)
yy = xx.transpose(1, 2).contiguous() #3 17 85 17
print("yy=",yy)
zz = yy.transpose(2, 3).contiguous()  # 3 17 17 85
print("zz=",zz)

########  完成了维度 transpose_1_2
a=[]
for idx in range(0,dim_0*dim_1*dim_2*dim_3):
    a.append(idx)

c=[]
for z in range(0,dim_0):
    for y in range(0, dim_2):
        for x in range(0,dim_1):
            for t in range(0,dim_3):
                c.append(a[z*dim_1*dim_2*dim_3+x*dim_2*dim_3+y*dim_2+t])
print(c)
########## c对应的 yy
print("cc---yy")
#########
d=[]
for z in range(0,dim_0):
    for y in range(0, dim_2):
        for x in range(0, dim_3):
            for t in range(0, dim_1):
                d.append(c[z*dim_1*dim_2*dim_3+x+y*dim_3*dim_1+t*dim_2])
print(d)
########## d对应的 zz
print("zz=d")

c++参考简单转换的python代码写就ok 测试没有问题 ,实际项目中的使用替换和改写,测试结果一致

#pred_bbox = pred_bbox.view(nA, -1, nH, nW).permute(0, 2, 3, 1).contiguous() #
# xx=pred_bbox.view(nA, -1, nH, nW)
# yy=xx.transpose(1,2).contiguous()
# zz=yy.transpose(2,3).contiguous()
# pred_bbox=zz
dim_0=nA
dim_2=nH
dim_3=nW
a = pred_bbox.view(-1).cpu().numpy().tolist()
dim_1 =int(len(a)/(dim_0*dim_2*dim_3))
c = []
for i in range(0, dim_0):
    for j in range(0, dim_2):
        for k in range(0, dim_1):
            for t in range(0, dim_3):
                c.append(a[i * dim_1 * dim_2 * dim_3 + k * dim_2 * dim_3 + j * dim_2 + t])
# print(c)
########## c对应的 yy
print("cc---yy")
#########
d = []
for i in range(0, dim_0):
    for j in range(0, dim_2):
        for k in range(0, dim_3):
            for t in range(0, dim_1):
                d.append(c[i * dim_1 * dim_2 * dim_3 + k + j * dim_3 * dim_1 + t * dim_2])
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
pred_orien=torch.FloatTensor(d).view(dim_0,dim_2,dim_3,dim_1).to(device)

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号