初入计算机视觉遇到的一些坑
1.pytorch中转tensor
x=np.random.randint(10,100,(10,10,10))
x=TF.to_tensor(x)
print(x)
这个函数会对输入数据进行自动归一化,比如有时候我们需要将0-255的图片转为numpy类型的数据,则会自动转为0-1之间
2.stack和cat之间的差别
stack
x=torch.randn((1,2,3))
y=torch.randn((1,2,3))
z=torch.stack((x,y))#默认dim=0
print(z.shape)
#torch.Size([2, 1, 2, 3])
所以stack的之后的数据也就很好理解了,z[0,...]
的数据是x,z[1,...]
的数据是y。
cat
z=torch.cat((x,y))
print(z.size())
#torch.Size([2, 2, 3])
cat之后的数据 z[0,:,:]
是x的值,z[1,:,:]
是y的值。
其中最关键的是stack之后的数据的size会多出一个维度,而cat则不会,有一个很简单的例子来说明一下,比如要训练一个检测模型,label是一些标记点,eg:[x1,y1,x2,y2]
送入网络的加上batchsize
则时Size:[batchsize,4],如果我已经有了两堆数据,data1:Size[128,4]
,data2:Size[128,4]
,需要将这两个数据合在一起的话目标data:Size[256,4]
。显然我们要做的是:torch.cat((data1,data2))
如果我们的数据是这样:有100个label,每一个label被放进一个list(data)中,[[x1,y1,x2,y2],[x1,y1,x2,y2],...]
其中data
是一个list长度为100,而list中每一个元素是张图片的标签,size为[4]我们需要将他们合一起成为一Size:[100,4]
的的数据。显然我们要做的是torch.stack(data)。而且torch.stack的输入参数为list类型!