1.报错”default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <U32“
原因:检查dataset的getitem,里面每次获得的数据是否是tensors, numpy arrays, numbers, dicts or lists
我的原始数据里大多数是float,但含有少数str,调用np.array后还是str,
因此for ... in dataloader时,正常迭代出几个batch后就会报错
2.numpy, pytorch类型转换:
参考numpy和torch数据类型转化问题_雷恩Layne的博客-CSDN博客_torch转float
1)numpy:
numpy使用astype转化数据类型,float默认转化为64位,可以使用np.float32
指定为32位
a= np.array([1,2,3])
a = a.astype(np.float)
print(a.dtype)
>>>float64
此外,注意
不要用float代替np.float,否则可能出现意想不到的错误;
不能从np.float64位转化np.float32,会报错;
np.float64与np.float32相乘,结果为np.float64;
在实际使用过程中,可以指定为np.float,也可以指定具体的位数,如np.float,不过直接指定np.float更方便;
2)torch tensor:
torch使用torch.float()
转化数据类型,float默认转化为32位,torch中没有torch.float64()
这个方法
b = torch.tensor([4,5,6])
b = b.float()
b.dtype
>>>torch.float32
3.pytorch RuntimeError: expected scalar type Double but found Float
搭神经网络后,传入训练数据时的报错
原因:神经网络中的权重默认是torch.float32吧?但传入的训练数据格式是float64的
解决:
首先
torch.set_default_tensor_type(torch.FloatTensor)
之后对传入的参数:
for batch_idx,tensor in enumerate(trainloader):
tensor = tensor.to(torch.float32)