device
首先是查看输入的两个数据的device是否一致,出现这种情况的原因可能是因为device不同导致的,可能在不同的GPU上。
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
data.to(device)
通过这个设定一个device,然后将data转到device中,然后debug查看数据的device是否相同。
注意:numpy类型没有to这个方法,只有tensor才有!!!
type
在我这里,我的两个输入数据是在同一个cuda中,但是还是出错了,通过查看数据类型可以看出,一个是torch.cuda.float16,另一个是torch.cuda.float32,所以出现了上面的那个HalfTensor的错误。
通过这里,也知道了这个错误的原因了,正常是float32,所以HalfTensor就是float16了。找到原因,只需要改变数据类型为float16即可。
data.to(torch.float16)
转换之后,代码就成功运行了!!!
这里再多说一句,如果碰到类似的权重和输入的数据类型不一致的情况下,我们可以使用模型默认的方式进行计算,也就是初始化之后,不改变模型中的参数的类型,删去model.half().float(),则模型的默认类型就是float32。
这里还是建议一般情况下不要改变数据类型,会比较乱,这种float16就是在不影响精度的情况下,减少计算资源的占用,减少GPU内存占用。
关键还是数据类型的问题,以后还是要注意这种细节!!