學習資源/來源:DataWhale組織-PyTorch教程浑槽、視頻教程
第1章:pytorch安裝
環(huán)境準備-創(chuàng)建虛擬環(huán)境
已安裝的環(huán)境:Anaconda3 2019.03 windows(python37)
# 查看所有環(huán)境
conda env list
# conda 創(chuàng)建虛擬環(huán)境
conda create -n torch python=3.7
# 刪除虛擬環(huán)境
conda remove -n env_name --all
# 激活環(huán)境
activate torch / sourch activate Env(Linux)
# 退出當前
deactivate
換源
一些國內(nèi)鏡像源
阿里云 http://mirrors.aliyun.com/pypi/simple/
??中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
??豆瓣(douban) http://pypi.douban.com/simple/
??清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/
??中國科學技術(shù)大學 http://pypi.mirrors.ustc.edu.cn/simple/
臨時換源:
pip install package_name==version -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
pip換源
Linux系統(tǒng)
-
用戶目錄下新建文件夾.pip,并新建文件pip.conf
cd ~ mkdir .pip/ vi pip.conf
-
編輯并保存pip.conf文件內(nèi)容
[global] index-url = http://pypi.douban.com/simple [install] use-mirrors =true mirrors =http://pypi.douban.com/simple/ trusted-host =pypi.douban.com
Windows系統(tǒng)
文件管理器路徑地址欄輸入:%APPDATA%回車,快速進入
C:\Users\電腦用戶\AppData\Roaming
文件夾中-
新建pip文件夾棺耍,并在文件夾中新建文件pip.ini配置文件糜颠,記事本打開填寫以下內(nèi)容(豆瓣源):
[global] index-url = http://pypi.douban.com/simple [install] use-mirrors =true mirrors =http://pypi.douban.com/simple/ trusted-host =pypi.douban.com
conda換源
通過修改用戶目錄下的.condarc文件更改源鏡像,填寫以下內(nèi)容(清華源):
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
Windows系統(tǒng)
- 執(zhí)行
conda config --set show_channel_urls yes
生成.condarc文件 - 修改 C:\Users\User_name.condarc 文件讼昆,內(nèi)容如上
Linux系統(tǒng)
cd ~
vi .condarc # 編輯以上內(nèi)容托享,Esc退出編輯模式并:wq保存
可通過 conda config --show default_channels 檢查是否換源成功。
查看顯卡
windows:
cmd/terminal輸入nvidia-smi(Linux與windows一樣)
使用NVIDIA控制面板和使用任務管理器查看自己是否有NVIDIA的獨立顯卡及其型號
查看可以兼容的CUDA版本浸赫,等會安裝PyTorch時是可以向下兼容的
安裝PyTorch
-
CUDA與CuDNN安裝(gpu版本安裝闰围,cpu版本可忽略)
-
CUDA下載- Base Installer 即可:https://developer.nvidia.com/cuda-10.2-download-archive
- 安裝完畢后安裝目錄下~.bin/(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2) 命令查看是否安裝成功:nvcc -V
-
下載對應cuda版本的cudnn(zip): cuDNN Archive | NVIDIA Developer
解壓cudnn文件,將三個文件夾復制到cuda安裝目錄下(與bin同級)
-
在同級目錄下既峡,./exras/demo_suite 測試是否安裝成功
- 打開cmd執(zhí)行:bandwidthTest.exe辫诅,返回pass則成功
- 打開cmd執(zhí)行:deviceQuery.exe,返回pass則成功
-
-
根據(jù)環(huán)境選擇版本和系統(tǒng)涧狮,也可選擇 install previous versions of PyTorch.
# CUDA 10.2 conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=10.2 -c pytorch
遇到報錯:
安裝提示刪除所在路徑的文件炕矮,重啟電腦即可。
注:上面conda安裝方式windows系統(tǒng)無法成功安裝gpu版本(torch.cuda.is_available()即使cuda安裝后還是返回False)
pip安裝:官網(wǎng)上選擇pip安裝方式者冤,通過鏈接下載對應版本文件
此處可下載: https://download.pytorch.org/whl/
torch&torchvision:選擇對應版本cu102, cp37
pip 安裝torch&torchvision:打開cmd執(zhí)行 pip install xxx.whl
-
檢驗是否安裝成功
import torch torch.cuda.is_available() torch.__version__ torch.version.cuda
PyTorch學習資源
- Awesome-pytorch-list:目前已獲12K Star肤视,包含了NLP,CV,常見庫,論文實現(xiàn)以及Pytorch的其他項目涉枫。
- PyTorch官方文檔:官方發(fā)布的文檔邢滑,十分豐富。
- Pytorch-handbook:GitHub上已經(jīng)收獲14.8K愿汰,pytorch手中書困后。
- PyTorch官方社區(qū)
- PyTorch官方tutorials:官方編寫的tutorials,可以結(jié)合colab邊動手邊學習
- 動手學深度學習:動手學深度學習是由李沐老師主講的一門深度學習入門課衬廷,在B站摇予,Youtube均有回放。
- Awesome-PyTorch-Chinese:常見的中文優(yōu)質(zhì)PyTorch資源
第2章:pytorch基礎知識
2.1張量
簡介
張量是基于向量和矩陣的推廣吗跋,可將標量視為零階張量侧戴,矢量/向量為一階張量,矩陣為二階張量跌宛。
創(chuàng)建tensor
import torch
# 隨機初始化矩陣
torch.rand(4,3)
# 創(chuàng)建全0矩陣
torch.zeros(4, 3, dtype=torch.long)
# 通過torch.zero_()和torch.zeros_like()
# 創(chuàng)建張量
x = torch.tensor([5.5, 3])
# 基于現(xiàn)有tensor,創(chuàng)建tensor
a = x.new_ones(4, 3, dtype=torch.double) # torch.ones(4,3,dtype=torch.double)
b = torch.randn_like(a, dtype=torch.float)
print(a.size(), b.shape())
張量的操作
加法操作:
import torch
# 方式1
x = torch.rand(4, 3)
y = torch.rand(4, 3)
print(x+y)
# 方式2
print(torch.add(x, y))
# 方式3 in-place,原值修改
y.add_(x)
print(y)
索引操作(類似numpy)
維度變換(常見torch.view()酗宋、torch.reshape())
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())
注: torch.view()
返回的新tensor
與源tensor
共享內(nèi)存(其實是同一個tensor
)
廣播機制
x = torch.arange(1, 3).view(1, 2)
y = torch.arange(1, 4).view(3, 1)
print(x+y)
2.2自動求導
AutoGrad
通過設置張量的.requires_grad
屬性,完成計算后通過調(diào)用.backward()
自動計算所有的梯度疆拘。每個張量都有.grad_fn
屬性
from __future__ import print_function
import torch
x = torch.randn(3,3,requires_grad=True)
print(x.grad_fn)
a = torch.randn(2, 2) # 缺失情況下默認 requires_grad = False
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
梯度
import torch
x = torch.ones(2, 2, requires_grad=True)
print(x)
y = x**2
z = y * y * 3
out = z.mean()
print(z, out)
out.backward()
print(x.grad)
# 注意:grad在反向傳播過程中是累加的(accumulated)蜕猫,所以一般在反向傳播之前需把梯度清零。
# 再來反向傳播?一次哎迄,注意grad是累加的
out2 = x.sum()
out2.backward()
print(x.grad)
out3 = x.sum()
x.grad.data.zero_()
out3.backward()
print(x.grad)
# 雅可比向量積
x = torch.randn(3, requires_grad=True)
print(x)
y = x * 2
i = 0
while y.data.norm() < 1000:
y = y * 2
i = i + 1
print(y)
print(i)
# torch.autograd 不能直接計算完整的雅可比矩陣
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
# 通過將代碼塊包裝在 with torch.no_grad(): 中回右,來阻止 autograd 跟蹤設置
print(x.requires_grad)
print((x ** 2).requires_grad)
with torch.no_grad():
print((x ** 2).requires_grad)
修改 tensor 的數(shù)值稀颁,又不被 autograd 記錄(即不會影響反向傳播), 以對 tensor.data 進行操作
x = torch.ones(1,requires_grad=True)
print(x.data) # 還是一個tensor
print(x.data.requires_grad) # 但是已經(jīng)是獨立于計算圖之外
y = 2 * x
x.data *= 100 # 只改變了值楣黍,不會記錄在計算圖匾灶,所以不會影響梯度傳播
y.backward()
print(x) # 更改data的值也會影響tensor的值
print(x.grad)
2.3并行計算
當服務器上有多個GPU,指定使用GPU租漂,不設置時tensor.cuda()會默認將tensor保存到第一塊GPU上阶女,等價于tensor.cuda(0)
可通過以下兩種方式設置:
# 1.設置在文件最開始部分
import os
os.environ["CUDA_VISIBLE_DEVICE"] = "2" # 設置默認的顯卡
# 2.調(diào)用py文件時指定
CUDA_VISBLE_DEVICE=0,1 python train.py # 使用0,1兩塊GPU