使用pytorch時所遇到的問題總結
1、ubuntu vscode切換虛擬環境
在ubuntu系統上,配置工作區文件夾所使用的虛擬環境。之前筆者誤以為只需要在vscode內置的終端上將虛擬環境切換過來即可,后來發現得通過配置vscode的解釋器(interpreter)具體方法如下:
選中需要配置的文件夾,然后點擊vscode左下角的寫有“Python ***”的位置(或者使用快捷鍵“ctrl+shift+p”)--》選擇文件夾--》從解釋器列表中選擇要用的解釋器。完成設置后,會在文件夾下面多出一個名為“.vscode”的文件夾,其中會多出一個名為“settings.json”的文件,經過設置后該文件內會多出一個條目來指向虛擬環境中的python的路徑,例如:python.pythonPath:"/home/lh/anaconda3/envs/pytorch/bin/python"。
2、使用DataLoader時報錯:raise RuntimeError('already started')
出錯位置在使用DataLoader時,將參數“num_workers”設置為大於0的值了,推測原因是沒有打開多線程功能,解決方法為將num_workers設置為0。如果需要要使用多個子線程來加載數據,那么就需要讓主程序在“if __name__ = 'main'"中運行。
3、pytorch中使用TensorBoard
問題(1): Import Error:TensorBoard logging requires TensorBoard with Python summary writer installed
這是由於當前的環境中沒有安裝TensorBoard。如果電腦上安裝有anaconda,那么直接使用命令“conda install tensorboard”即可。
問題(2):調出tensorboard界面
當在程序中調用SummaryWriter之后,在控制台中會給出如下信息:
其中需要注意的是“--port 41889”。然后我們在控制台中輸入命令“tensorboard --logdir='log' --port=41889”,--logdir用來指向之前所指定的日志目錄,--port就是之前控制台中給出的端口號。輸入指令后,控制台中會給出一個網址,打開該網址就可以在瀏覽器中打開tensorboard界面了。
4、pytorch使用dataloader時,報出“TypeError:default_collect:batch must contain tensors, numpy arrays, numbers,dicts or lists; found <class 'PIL.Image.Image'>”
這是因為在創建torchvision.Dataset對象的時候沒有將數據庫內的圖像轉為torch張量,在創建數據庫對象的時候將參數transform進行如下設置就可以了:transform=transform.ToTensor()。
5、RuntimeError:Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same
這是由於傳入模型的數據是放在CPU內存中的,而模型本身被放置在GPU內存中了。因此只需要將輸入的數據放置到GPU內存中就可以解決問該問題了。
6、pytorch,同名函數后面加一個'_',例如:'clamp()'與'clamp_()'
一般來說,如果函數后帶了一個下划線,就意味着在改變當前張量的值的同時返回一個修改后的副本;如果不帶下划線,那么就只返回修改后的副本,而不改變原來張量的值。例如:
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))
結果為如下圖,可見張量a在調用clamp_函數后其本身的值也會發生改變,但是調用clamp的時候則只會返回一個修改后的副本。
7、python中(1)與(1,)的區別
‘(1)’這種寫法得到的是一個int類型的數據,而‘(1, )’得到的是一個turple類型的數據。驗證如下:
8、tqdm進度條
tqdm.update()所傳入的參數指的是進度條前進的步長,而不是當前進度。