torch.Tensor有两部分数据:gradient和data
当numpy和Tensor互转时,numpy->Tensor没啥问题,Tensor->numpy时有两种方法:
第一种: T1.data.numpy或者T1.detach().numpy。即只转data数据,否则会报错:RuntimeError: Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
第二种:在模型inference的代码,整体用with torch.no_grad()括住,这样会更省显存,因为模型在前向过程中不再保存gradient的数据
为什么有时候可以T1.numpy()直接转,上代码:
t1=torch.Tensor([1,2,3]) t1=t1.requires_grad_() t2=torch.Tensor([1,2,3]) t2=t2.numpy() t1=t1.numpy() #报错RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
所以本质看这个Tensor存没存gradient,从网络中出来的输出,默认存gradient因为之后很可能做BP。但是inference过程中应该with torch.no_grad()去掉gradient保存,来节约资源
暑期编程PK赛 得CSDN机械键盘等精美礼品!


