Pytorch RuntimeError: expected type torch.cuda.FloatTensor but got torch.FloatTensor


Pytorch RuntimeError: expected type torch.cuda.FloatTensor but got torch.FloatTensor

在使用Pytorch框架訓練模型時,拋出RuntimeError: expected type torch.cuda.FloatTensor but got torch.FloatTensor。

產生原因及分析

待訓練網絡在GPU中運算,但有部分數據未進入GPU。
基於Pytorch框架使用GPU進行訓練時,輸入數據(樣本、標記)、網絡結構均會在GPU中進行計算,例如:

……
device = 'cuda:0'
model = models.resnet18(pretrained=True).to(device)
……
inputs = inputs.to(device)
labels = labels.to(device)
……

但如果在網絡計算過程中,有新加入Tensor但沒有明確指定其在GPU中運算(默認是在CPU中),則會拋出上述異常。

解決方法1

解決辦法(單GPU)

通過上述分析可知,在網絡中引入新的Tensor時,顯式指定其運行設備為GPU,可解決上述問題,例如:

……
random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype).to(device)
……

在單GPU時,該方法能夠解決上述問題;但在多GPU情況下,仍會拋出不在同一個GPU上計算的異常。

解決辦法(多GPU)

對於多GPU,網絡中新增Tensor一般會與輸入(inputs)進行計算;因此獲取inputs所在的GPU設備,將新Tensor的計算設備設置為與之相同,問題得解,例如:

……
random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype).to(inputs.device)
……

或者

……
random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype, device=inputs.device)
……

解決辦法2

常見錯誤 RuntimeError: expected type torch.FloatTensor but got torch.cuda.FloatTensor

https://www.jianshu.com/p/0be7a375bdbe

https://blog.csdn.net/qq_38410428/article/details/82973895

計算中有的參數為cuda型,有的參數卻是cpu型,就會遇到這樣的錯誤。

12

解決辦法:

該加.cuda()的加上,不該用.cpu()的地方去掉它。

235


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM