使用pytorch時(shí)所遇到的問(wèn)題總結(jié)
1、ubuntu vscode切換虛擬環(huán)境
在ubuntu系統(tǒng)上,配置工作區(qū)文件夾所使用的虛擬環(huán)境。之前筆者誤以為只需要在vscode內(nèi)置的終端上將虛擬環(huán)境切換過(guò)來(lái)即可,后來(lái)發(fā)現(xiàn)得通過(guò)配置vscode的解釋器(interpreter)
具體方法如下:
選中需要配置的文件夾,然后點(diǎn)擊vscode左下角的寫有“Python ***”的位置(或者使用快捷鍵“ctrl+shift+p”)--》選擇文件夾--》從解釋器列表中選擇要用的解釋器。
完成設(shè)置后,會(huì)在文件夾下面多出一個(gè)名為“.vscode”的文件夾,其中會(huì)多出一個(gè)名為“settings.json”的文件,經(jīng)過(guò)設(shè)置后該文件內(nèi)會(huì)多出一個(gè)條目來(lái)指向虛擬環(huán)境中的python的路徑,
例如:
python.pythonPath:"/home/lh/anaconda3/envs/pytorch/bin/python"
2、使用DataLoader時(shí)報(bào)錯(cuò):
raise RuntimeError('already started')
出錯(cuò)位置在使用DataLoader時(shí),將參數(shù)“num_workers”設(shè)置為大于0的值了,推測(cè)原因是沒(méi)有打開多線程功能,解決方法為將num_workers設(shè)置為0。
如果需要要使用多個(gè)子線程來(lái)加載數(shù)據(jù),那么就需要讓主程序在“if __name__ = 'main'"中運(yùn)行。
3、pytorch中使用TensorBoard
問(wèn)題(1):
Import Error:TensorBoard logging requires TensorBoard with Python summary writer installed
這是由于當(dāng)前的環(huán)境中沒(méi)有安裝TensorBoard。如果電腦上安裝有anaconda,那么直接使用命令“conda install tensorboard”即可。
問(wèn)題(2):調(diào)出tensorboard界面
當(dāng)在程序中調(diào)用SummaryWriter之后,在控制臺(tái)中會(huì)給出如下信息:

其中需要注意的是“--port 41889”。然后我們?cè)诳刂婆_(tái)中輸入命令“tensorboard --logdir='log' --port=41889”,--logdir用來(lái)指向之前所指定的日志目錄,--port就是之前控制臺(tái)中給出的端口號(hào)。輸入指令后,控制臺(tái)中會(huì)給出一個(gè)網(wǎng)址,打開該網(wǎng)址就可以在瀏覽器中打開tensorboard界面了。
4、pytorch使用dataloader時(shí),
報(bào)出“TypeError:default_collect:batch must contain tensors, numpy arrays, numbers,dicts or lists; found class 'PIL.Image.Image'>”
這是因?yàn)樵趧?chuàng)建torchvision.Dataset對(duì)象的時(shí)候沒(méi)有將數(shù)據(jù)庫(kù)內(nèi)的圖像轉(zhuǎn)為torch張量,在創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象的時(shí)候?qū)?shù)transform進(jìn)行如下設(shè)置就可以了:transform=transform.ToTensor()。
5、報(bào)錯(cuò)
RuntimeError:Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same
這是由于傳入模型的數(shù)據(jù)是放在CPU內(nèi)存中的,而模型本身被放置在GPU內(nèi)存中了。因此只需要將輸入的數(shù)據(jù)放置到GPU內(nèi)存中就可以解決問(wèn)該問(wèn)題了。
6、pytorch,同名函數(shù)后面加一個(gè)'_',例如:'clamp()'與'clamp_()'
一般來(lái)說(shuō),如果函數(shù)后帶了一個(gè)下劃線,就意味著在改變當(dāng)前張量的值的同時(shí)返回一個(gè)修改后的副本;如果不帶下劃線,那么就只返回修改后的副本,而不改變?cè)瓉?lái)張量的值。
例如:
import torch
a=torch.rand(3)
print('a:{}'.format(a))
print("clamp效果:")
b=a.clamp(0, 0.5)
print('b:{}'.format(b))
print('a:{}'.format(a))
print("clamp_效果:")
b=a.clamp_(0, 0.5)
print('b:{}'.format(b))
print('a:{}'.format(a))
結(jié)果為如下圖,可見張量a在調(diào)用clamp_函數(shù)后其本身的值也會(huì)發(fā)生改變,但是調(diào)用clamp的時(shí)候則只會(huì)返回一個(gè)修改后的副本。

7、python中(1)與(1,)的區(qū)別
‘(1)'這種寫法得到的是一個(gè)int類型的數(shù)據(jù),而‘(1, )'得到的是一個(gè)turple類型的數(shù)據(jù)。驗(yàn)證如下:

8、tqdm進(jìn)度條
tqdm.update()所傳入的參數(shù)指的是進(jìn)度條前進(jìn)的步長(zhǎng),而不是當(dāng)前進(jìn)度。
補(bǔ)充:Pytorch中常見的報(bào)錯(cuò)解決方案
本文用于記錄所在pytorch所遇到過(guò)的運(yùn)行時(shí)錯(cuò)誤,持續(xù)更新。
1、變量所在設(shè)備(CPU,GPU)不一致問(wèn)題
RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
可能原因:現(xiàn)在假設(shè)代碼要在GPU上運(yùn)行,并且你已經(jīng)進(jìn)行my_model.to(device)操作了。注意只有my_model中的屬性(也就是self.開頭的變量)才會(huì)進(jìn)行.to(device)。如果出現(xiàn)這個(gè)錯(cuò)誤,可能是有的中間變量需要手動(dòng)再顯式地.to(device)一下~
2、在Conv2d中padding或stride的參數(shù)個(gè)數(shù)錯(cuò)誤的問(wèn)題
RuntimeError: expected padding to be a single integer value or a list of 1 values to match the convolution dimensions, but got padding=[0, 0]
原因一:
對(duì)于一張二維圖片來(lái)說(shuō),它的padding也是二維的,即橫、縱方向上都需要設(shè)置padding(當(dāng)然這兩個(gè)數(shù)字一般是一樣的)?,F(xiàn)在為什么提示我們padding應(yīng)該是一維的呢?一定是輸入數(shù)據(jù)維度不對(duì)。

原因二:
上面說(shuō)的是最可能的情況,如果你發(fā)現(xiàn)圖片已經(jīng)是四維的卻還有這個(gè)報(bào)錯(cuò),請(qǐng)檢查你Conv2d()的輸入?yún)?shù)。
例如,如果你把stride設(shè)置為一維的[3]而不是二維3(注意3會(huì)被自動(dòng)處理成[3, 3]),同時(shí)padding為二維的0。
pytorch發(fā)現(xiàn)stride是一維的,而padding卻是二維的,就會(huì)報(bào)錯(cuò)。
3、inplace operation問(wèn)題
one of the variables needed for gradient computation has been modified by an inplace operationone of the variables needed for gradient computation has been modified by an inplace operation
inplace操作可能會(huì)使得backward無(wú)法進(jìn)行(因?yàn)楫?dāng)前Tensor可能會(huì)在另一個(gè)地方被用到),比如forward出現(xiàn)了如下代碼:
你可能需要該成:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Pytorch高階OP操作where,gather原理
- Pytorch中的gather使用方法
- 淺談Pytorch中的torch.gather函數(shù)的含義
- Pytorch深度學(xué)習(xí)gather一些使用問(wèn)題解決方案