使用Pytorch的常見錯誤彙總 gan-based-HRRS-Sample-Generation-for-image-classification-master代碼中的問題

ucm數據集中圖像大小不全是256*256的 ,有253*256的導致處理時候遇到問題。如何解決呢?

現在 d盤 下 可運行tensorflow下train文件夾下的圖像全部是256*256.

那些年我們一起踩過的坑!
文章目錄
那些年我們一起踩過的坑!
Error
標籤範圍問題
輸入圖像大小不一的問題
內存連續問題
保存和加載整個模型的問題
argument or attribute error
nll_loss關鍵字參數問題
0.4版本帶來的Error
torch.tensor問題
torch.device問題
Warning
0.4版本帶來的Warning
單值張量的索引問題
volatile was removed
`Tensor`和`Variable`合併
Attention
Error
標籤範圍問題
這個錯誤出現在我參考別人的源碼來訓練一個車型識別模型,共196類,設置輸出num_classes = 196,結果報下面錯誤,原因是我的輸入的標籤是1-196,超出索引範圍,正確標籤範圍應該是[0,num_classes)

    _, pred = output.data.cpu().topk(1, dim=1)
RuntimeError: cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/THC/generic/THCTensorCopy.c:70
1
2
可參考:Issue #1204 · pytorch/pytorch

輸入圖像大小不一的問題
數據集圖像大小不一,加載訓練集時進行了Resize and Crop ,但是在測試時忘記了,因此出現了以下報錯信息:

    for batch_idx, (input, target) in enumerate(loader):
  File "/usr/local/lib/python2.7/dist-packages/torch/utils/data/dataloader.py", line 264, in __next__
    batch = self.collate_fn([self.dataset[i] for i in indices])
  File "/usr/local/lib/python2.7/dist-packages/torch/utils/data/dataloader.py", line 138, in default_collate
    return [default_collate(samples) for samples in transposed]
  File "/usr/local/lib/python2.7/dist-packages/torch/utils/data/dataloader.py", line 115, in default_collate
    return torch.stack(batch, 0, out=out)
RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 182 and 360 in dimension 2 at /pytorch/aten/src/TH/generic/THTensorMath.c:3586


內存連續問題
# version 0.3.1
x_t = x.transpose(1, 2)
x_t.view(-1, 1, frame_num)
RuntimeError: invalid argument 2: input is not contiguous at /pytorch/torch/lib/THC/generic/THCTensor.c:

原因
對張量進行轉置之後,再對轉置後的張量進行view,發生錯誤,報錯原因是輸入不連續。要理解這個錯誤的發生原因主要涉及幾個點,第一是torch.Tensor和numpy.ndarray一樣,由計算機內存的連續一維段組成;第二是transpose操作共享底層儲存;第三是view的前提是滿足連續性條件。共享底層存儲導致x_t並非是按自己的索引方式連續存儲,因此在view操作時報錯。
解決方案
在view操作之前調用.contiguous()即可。
實測0.4.1版本會出現更詳細的錯誤提示以及解決指導,大概是真的太容易出錯了!
參考資料
RuntimeError: input is not contiguous - PyTorch Forums
保存和加載整個模型的問題
問題出現在我保存整個模型之後,在另一個項目文件中加載模型報錯

AttributeError: Can't get attribute 'Generator' on <module '__main__' from ...
1
在Error in loading model in PyTorch - Stack Overflow得到了線索,然後去查看文檔和手冊Saving and Loading Models — PyTorch Tutorials,發現了問題所在!!!
原因: Pytorch保存整個模型的序列化數據綁定到特定類以及保存模型時使用的確切目錄結構。因爲pickle不保存模型類本身。相反,它會保存包含類的文件的路徑,該文件在加載時使用。 因此,當您在其他項目中或在重構之後使用時,代碼可能會以各種方式中斷,屬性錯誤之類的。

argument or attribute error
nll_loss關鍵字參數問題
跑個官例手寫字體就報錯

TypeError: nll_loss() got an unexpected keyword argument 'reduction'
1
help(F.nll_loss) ,查看文檔,確實沒有該參數。跑到官方手冊查看,有該參數,確認是版本差!
總結: 官例跟隨最新的版本,如果自己的是老版本,容易遇到一些argument or attribute error,這時候要根據官方手冊排查,確認之後可以選擇更新包或者自己recoding。

0.4版本帶來的Error
詳細原因見下文Attention部分

torch.tensor問題
0.4之前版本無法使用torch.tensor創建張量

# 注意:諸多原因可以造成該錯誤提示,不能用於定位原因!!!
TypeError: 'module' object is not callable

torch.device問題
AttributeError: module 'torch' has no attribute 'device'

Warning
很多情況下警告都是由於版本更新引起,如果是run別人的源碼,一定要注意版本問題!

0.4版本帶來的Warning
單值張量的索引問題
UserWarning: invalid index of a 0-dim tensor. This will be an error in PyTorch 0.5. Use tensor.item() to convert a 0-dim tensor to a Python number
1
0.4版本支持0維(標量)張量,標量可以使用新的torch.tensor函數來創建,可以將它視爲numpy.array。索引向量返回一個標量,使用tensor.item()將0維張量轉爲一個Python數字。

# for Pytorch 0.4+
>>> torch.tensor(3.1416)         # create a scalar directly
tensor(3.1416)
>>> torch.tensor(3.1416).size()  # scalar is 0-dimensional
torch.Size([])
>>> torch.tensor([3]).size()     # compare to a vector of size 1
torch.Size([1])
>>> vector = torch.arange(2, 6)  # this is a vector
>>> vector
tensor([ 2.,  3.,  4.,  5.])
>>> vector.size()
torch.Size([4])
>>> vector[3]                    # indexing into a vector gives a scalar
tensor(5.)
>>> vector[3].item()             # .item() gives the value as a Python number
5.0

以前索引一維Tensor返回一個Python數字,索引一維Variable返回一個大小爲1的一維tensor。

# for Pytorch 0.3.1
>>> a = torch.Tensor([1,2,3])
>>> b= torch.autograd.Variable(a)
>>> a[1]
2.0
>>> b[1]
Variable containing:
 2
[torch.FloatTensor of size 1]
>>> a.sum()
6.0
>>> b.sum()
Variable containing:
 6
[torch.FloatTensor of size 1]

volatile was removed
UserWarning: volatile was removed and now has no effect. Use `with torch.no_grad():` instead.
  input_var = torch.autograd.Variable(input.cuda(async=True), volatile=True)
1
2
Tensor和Variable合併
在此之前只有Variable支持backward,Variable是Tensor的封裝。

0.4版本中,torch.autograd.Variable和torch.Tensor將同屬一類。更確切地說,torch.Tensor 能夠跟蹤歷史並像舊版本的 Variable 那樣運行; Variable 封裝仍舊可以像以前一樣工作,但返回一個torch.Tensor類型的對象。 這意味着你再也不需要在代碼中到處使用Variable 封裝。

Attention
關於0.4版本帶來的各類問題,我強烈推薦你閱讀PyTorch 0.4.0遷移指南
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章