0
点赞
收藏
分享

微信扫一扫

43、python的permute、tanspose、view、reshape方法转换转c++函数去处理


基本思想:需要使用c++将permute维度的数据转成c++进行后处理,所以记录一下,可以窥探到python底层是如何做这种数据维度变化的

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)

另一个例子


import torch
a=torch.arange(0,2*3*4*5).view(2,3,4,5)

#print(a)
b=a.transpose(0,2).contiguous()
print(b)
c=b.transpose(1,3).contiguous()
print(c)
xx=a.permute(2, 3, 0, 1) # 2 3 4 5 4 5 2 3
if xx.equal(c):
print("ok")
c=a.flatten().tolist()

l=[]
dim_0=2
dim_1=3
dim_2=4
dim_3=5

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

print(d)

举报

相关推荐

0 条评论