https://www.lizenghai.com/archives/41780.html
最近開始學習pytorch,在訓練時出現標題所示問題。瀏覽了很多方法后,總結出出現這個問題的主要原因是輸入的數據類型與網絡參數的類型不符。
Input type為torch.cuda.FloatTensor(GPU數據類型), weight type(即net.parameters)為torch.FloatTensor(CPU數據類型)
網上資料大多數的解決方法是 將網絡放到GPU上。有以下兩種方法
方法一
device = torch.device('cuda:0')
net.to(device)
方法二:
net = net.cuda()
但是上述方法並不適合我碰到的問題,經過試驗,最后發現自己搭建的net有一部分沒有寫入GPU。出現問題的原因是,在搭建net時,在forward函數中兩種定義網絡的方式不能混用,如下圖。
錯誤寫法
解決辦法:現將幾個網絡層在init中定義好
更改后的__init__
然后forward改為:
更改后的forward
問題解決!!!!
https://www.jianshu.com/p/73759cee9e36
==================================================================================
錯誤代碼:
self.model = [] for i in range(num_modal): self.model.append(ResNet50())
#############
outs = []
for i in range(x.size(1)):
outs.append(self.model[i].fusion_forward(x[:, i, :]))
正確代碼:
self.model = [] for i in range(num_modal): self.model.append(ResNet50()) self.models = nn.Sequential(*list([m for m in self.model])) ########### outs = [] for i in range(x.size(1)): outs.append(self.models[i].fusion_forward(x[:, i, :]))