我有一批图像(尺寸为“ batchsize x通道x高度x宽度”的4d张量/阵列,我想在每个图像上绘制大小为s的零的水平条,但是在每个图像上跨越不同的行。我可以这对于for循环来说是微不足道的,但是我一直无法弄清矢量化的实现。
理想情况下,我将生成“批量大小”随机起点的一维张量r,并执行类似的操作t[:,:,r:r+s,:] = 0
。如果我尝试这个我会TypeError: only integer scalar arrays can be converted to a scalar index
如果我做一个玩具示例,并尝试仅使用两个图像拉出批处理中的两个不同部分,则执行类似t[:,:,torch.tensor(([1,2],[2,3])),:]
5D张量的操作,因为它从批处理中的两个图像中拉出了这两个部分。如何抓取这些不同的部分,但每个图像只有一个?在这种情况下,如果输入为2xCxHxW,则我想要2xCx2xW,其中第一项对应于第一幅图像的行1和2,第二项对应于第二幅图像的行2和3。谢谢。
您可以使用此功能创建一个遮罩,您可以在该遮罩上按其索引在y或x轴上执行操作。您可以通过将索引的x值设置为y索引来做到这一点。
bsg = sgs.data
device = sgs.device
bs, _, x, y = bsg.shape
max_y = y-size-1
rs = torch.randint(0, max_y, (bs,1), device=device)
m = torch.arange(y,device=device).repeat(bs, x)
gpumask = ((m < rs) | (m > (rs+size))).view(bs, 1, x, -1)
gpumask*bsg
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句