大佬教程收集整理的这篇文章主要介绍了冒泡 3-D 张量 PyTorch,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在尝试将以下函数转换为仅操作张量的函数时遇到了一些问题。
def valID_sequence_output(sequence_output,valID_mask):
bs,max_len,feat_dim = sequence_output.shape
valID_output = torch.zeros(bs,feat_dim,dtype=torch.float32)
for i in range(bs):
jj = -1
for j in range(max_len):
if valID_mask[i][j].item() == 1:
jj += 1
valID_output[i][jj] = sequence_output[i][j]
return valID_output
可以按如下方式创建输入张量:
size = ((2,5,2))
sequence_output = torch.randint(0,250,size=sizE)
valID_mask = torch.randint(0,2,size=size[:2])
我的主要目标是“冒泡”sequence_output
的非空行。例如,sequence_output
等于:
tensor([[[ 0,0],[ 15,47],[124,230],[ 0,[ 65,31]],[[ 0,[ 0,[139,228],[224,205]]])
我正在尝试获得以下张量:
tensor([[[ 15,[ 65,31],0]],[[139,205],0]]])
如果有人对如何做到这一点有建议,我将不胜感激:D
我设法想出了一个非常讨厌的解决方案(他可能不是最理想的),方法是构建一个由零和一组成的矩阵 A
,在执行矩阵乘法时将交换 X
的行......
def vso(seq_out,valid_mask):
X = torch.where(valid_mask.unsqueeze(-1) == 1,seq_out,torch.zeros_like(seq_out))
bs,max_len,_ = X.shape
tu = torch.unique(torch.nonzero(X)[:,:2],dim=0)
batch_axis = tu[:,0]
rows_axis = tu[:,1]
a = torch.arange(bs).repeat(batch_axis.shapE).reshape(batch_axis.shape[0],-1).T
T = torch.cumsum(batch_axis == a,dim=1) - 1
cols_axis = T[batch_axis,torch.arange(batch_axis.shape[0])]
A = torch.zeros((bs,max_len))
A[(batch_axis,cols_axis,rows_axis)] = 1
valid_output = torch.matmul(A,X)
return valid_output
仍在寻找更好的答案!
以上是大佬教程为你收集整理的冒泡 3-D 张量 PyTorch全部内容,希望文章能够帮你解决冒泡 3-D 张量 PyTorch所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。