【python】錯誤解決經歷


【持續更新】

python

1、【RuntimeWarning: invalid value encountered in multiply】

{乘法中遇到無效值,比如 inf 或者 nan 等}

2、【non-default argument follows default argument】

{原因是將沒有默認值的參數在定義時放在了有默認值的參數的后面} →→解決→→{將沒有default值的參數放在前面}

{python中規定:函數調用的時候,如果第一個參數使用了關鍵字綁定,后面的參數也必須使用關鍵字綁定}

3、【list index out of range

{ list[index] index超出范圍 ////////  list是一個空的 沒有一個元素 進行list[0]就會出現該錯誤 }

4、【ValueError: there aren't any elements to reflect in axis 0 of 'array'

{numpy中數組padding操作處報錯,當輸入數據(list or ndarray)長度為0時觸發,詳見 \Lib\site-packages\numpy\lib\arraypad.py}

{詳細討論參見GitHub上numpy中的issue}

{解決:已知是input data為空導致的,追溯到數據處理階段debug即可,可以使用ipdb工具追蹤}

5、import torchvision時報錯【ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'

參考CSDN博客,torchvision在運行時要調用PIL模塊,調用PIL模塊的PILLOW_VERSION函數。但是PILLOW_VERSION在Pillow 7.0.0之后的版本被移除了,Pillow 7.0.0之后的版本使用__version__函數代替PILLOW_VERSION函數。

{解決:根據報錯的最后一行提示,打開function.py文件,使用from PIL import Image, ImageOps, ImageEnhance, __version__ 替換文件中from PIL import Image, ImageOps, ImageEnhance,PILLOW_VERSION這句,保存。}

GPU

1、【RuntimeError: CUDA out of memory.

{訓練時報錯,之前1.2G數據可訓練,現在7.8G數據報錯}{訓練時,使用CUDA_VISIBLE_DEVICES分配給一塊16G的顯卡}

{最簡單粗暴方法就是減少batch_size?}

{batchNorm簡單來說就是批規范化,這個層類似於網絡輸入進行零均值化和方差歸一化的操作,BN層的統計數據更新是在每一次訓練階段model.train()后的forward()方法中自動實現的。}

pytorch

1、【invalid argument 0: Sizes of tensors must match except in dimension 0.】

{出現在 torch.utils.data.DataLoader 輸出的 batch data 讀取處}  {DataLoader里面數據讀取有誤,准確來說,是image類型數據讀取,要注意通道數和尺寸的統一性} {將輸入的圖片transform為統一尺寸和通道}

2、【THCudaCheck FAIL file=/pytorch/aten/src/THC/generic/THCTensorMathPointwise.cu line=207 error=710 : device-side assert triggered

【RuntimeError: CUDA error: device-side assert triggered】

當模型在GPU上運行的時候其實是沒辦法顯示出真正導致錯誤的地方的(按照PyTorch Dev的說法:“Because of the asynchronous nature of cuda, the assert might not point to a full correct stack trace pointing to where the assert was triggered from.”即這是CUDA的特性,他們也沒辦法),所以可以通過將模型改成在CPU上運行來檢查出到底是哪里出錯(因為CPU模式下會有更加細致的語法/程序檢查)。但是當訓練網絡特別大的時候,這個方法通常是不可行的,轉到CPU上訓練的話可能會花費很長時間[1]。

{連續訓練若干個task,每個task的類別數目不一致,訓練第二個task的時候報錯} {即網絡輸出的類比和實際類別數目不符合}

【有人說可以在命令前加上CUDA_LAUNCH_BLOCKING=1】【之后運行】

【跑完第一個task的所有epoch后UserWarning】【task2的epoch1仍舊報錯,THCudaCheck FAIL file=/pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu line=110 error=710 : device-side assert triggered

/pytorch/aten/src/THCUNN/ClassNLLCriterion.cu:106: void cunn_ClassNLLCriterion_updateOutput_kernel(Dtype *, Dtype *, Dtype*, long *, Dtype *, int, int, int, int, long) [with Dtype = float, Acctype = float]: block: [0,0,0], thread: [31,0,0] Assertion `t >= 0 && t < n_classes` failed.
THCudaCheck FAIL file=/pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu line=110 error=710 : device-side assert triggered

 [2]中提出:基本上來說,device-side assert triggered意味着有數組的越界問題了。

 另,發現出現這個報錯的問題挺多的,但是具體原因不一定是相同的,要仔細看報錯的細節信息。

參考

[1] https://blog.csdn.net/Geek_of_CSDN/article/details/86527107

[2] https://horseee.github.io/2019/02/27/ERROR-device-side-assert-triggered/


免責聲明!

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



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