兩類深度學習框架的優缺點
動態圖(PyTorch)
計算圖的進行與代碼的運行時同時進行的。
靜態圖(Tensorflow <2.0)
自建命名體系
自建時序控制
難以介入
使用深度學習框架的優勢
GPU 加速 (cuda)
自動求導
經常使用網絡層的API
PyTorch 的特色
支持 GPU
動態神經網絡
Python 優先
命令式體驗
輕鬆擴展
1.Pytorch簡介
Pytorch是Facebook 的 AI 研究團隊發佈了一個基於 Python的科學計算包,旨在服務兩類場合:
替代numpy發揮GPU潛能(在線環境暫時不支持GPU)
一個提供了高度靈活性和效率的深度學習實驗性平臺
2.Pytorch特色及優點
2.1 Pytorch特色
PyTorch 提供了運行在 GPU/CPU 之上、基礎的張量操做庫;
能夠內置的神經網絡庫;
提供模型訓練功能;
支持共享內存的多進程併發(multiprocessing )庫等;
2.2 Pytorch特色
處於機器學習第一大語言 Python 的生態圈之中,使得開發者能使用廣大的 Python 庫和軟件;如 NumPy、SciPy 和 Cython(爲了速度把 Python 編譯成 C 語言);
(最大優點)改進現有的神經網絡,提供了更快速的方法——不須要從頭從新構建整個網絡,這是因爲 PyTorch 採用了動態計算圖(dynamic computational graph)結構,而不是大多數開源框架(TensorFlow、Caffe、CNTK、Theano 等)採用的靜態計算圖;
提供工具包,如torch 、torch.nn、torch.optim等;
3.Pytorch經常使用工具包
torch :相似 NumPy 的張量庫,強 GPU 支持 ;
torch.autograd :基於 tape 的自動區別庫,支持 torch 之中的全部可區分張量運行;
torch.nn :爲最大化靈活性未涉及、與 autograd 深度整合的神經網絡庫;
torch.optim:與 torch.nn 一塊兒使用的優化包,包含 SGD、RMSProp、LBFGS、Adam 等標準優化方式;
torch.multiprocessing: python 多進程併發,進程之間 torch Tensors 的內存共享;
torch.utils:數據載入器。具備訓練器和其餘便利功能;
torch.legacy(.nn/.optim) :處於向後兼容性考慮,從 Torch 移植來的 legacy 代碼;
pytorch 入門指南
1. pytorch 概述
pytorch是facebook 開發的torch(Lua語言)的python版本,於2017年引爆學術界
官方宣傳pytorch側重兩類用戶:numpy的gpu版、深度學習研究平臺
pytorch使用動態圖機制,相比於tensorflow最開始的靜態圖,更爲靈活
當前pytorch支持的系統包括:win,linux,macos
2. pytorch基本庫
經常使用的pytorch基本庫主要包括:
torch: 內含一些經常使用方法,與numpy比較像
torch.Tensor:內含一些操做tensor的方法,可經過tensor.xx()進行調用
torch.nn:內含一些經常使用模型,如rnn,cnn等
torch.nn.functional:內含一些經常使用方法,如sigmoid,softmax等
torch.optim:內含一些優化算法,如sgd,adam等
torch.utils.data:內含一些數據迭代方法
3. 基本操做
a. tensor操做
# 初始化空向量
torch.empty(3,4)
# 隨機初始化數組
torch.rand(4,3)
# 初始化零向量
torch.zeros(4,3, dtype=torch.int)
# 從數據構建數組
x = torch.tensor([3,4],dtype=torch.float)
x = torch.IntTensor([3,4])
# 獲取tensor的尺寸,元組
x.shape
x.size()
# _在方法中的意義:表示對自身的改變
x = torch.ones(3,4)
# 如下三個式子 含義相同
x = x + x
x = torch.add(x, x)
x.add_(x)
# 索引,像操做numpy同樣
x[:,1]
# 改變形狀
x.view(-1)
x.view(4,3)
# 若是隻包含一個元素值,獲取
x = torch.randn(1)
x.item()
# 增長一維
input = torch.randn(32, 32)
input = input.unsqueeze(0)
input.size()
# tensor的data仍是tensor,可是requires_grad=False
x.data.requires_grad
# 改變類型
x.type(torch.LongTensor)123456789101112131415161718192021222324252627282930313233343536373839404142434445
b. numpy 與 tensor的轉換
# 轉換, 共享內存
a= numpy.array([1,2,3])
a = torch.from_numpy(a)
a.numpy()1234
c. 調用gpu
# gpu是否可用
torch.cuda.is_available()
# 調用設備
device = torch.device('cpu') # cuda or cpu
a = torch.tensor([1,2,3], device='cuda') # 直接在gpu上建立
a = a.to(device) # 上傳
a = a.to('cpu') # 上傳, cpu or cuda
a = a.cuda() # 上傳cuda12345678
d. 梯度
.requires_grad ,決定是否可微(梯度)
.backward(), 計算梯度;若是單獨一個值則不需指定參數,不然需傳入權重(尺寸與tensor的size同)
.grad, 用於存儲梯度累計值。 只有tensor有梯度值,計算節點沒有
.detach(), 至關於新建了一個變量,歷史的計算圖無效
with torch.no_grad():, 評估模型時可用到,不計算梯度
.grad_fn, 節點是如何產生的;用戶創造的tensor([1,2,3]).grad_fn 爲None
.data(), tensor值,requires_grad=False
# 建立可微的tensor
x = torch.ones(2,3,requires_grad=True)
# 改變可微性
x.requires_grad_(False)
# 得到梯度值
x = torch.ones(2, 2, requires_grad=True)
y = x +2
z = y * y *3
out = torch.sum(z)
out.backward()
x.grad
# 無梯度, 報錯
with torch.no_grad():
x = torch.ones(2, 2, requires_grad=True)
y = x +2
z = y * y *3
out = torch.sum(z)
out.backward()
x.grad12345678910111213141516171819202122
e. 定義模型
兩種定義方式
class定義
Sequential定義
# 經過class定義
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 下面經過實例變量的形式聲明模型內須要學習的參數
self.fc1 = nn.Linear(5, 10)
self.fc2 = nn.Linear(10,20)
def forward(self, x):
# 下面定義計算圖
x = self.fc1(x)
x = nn.functional.relu(x)
x = self.fc2(x)
return x
net = Net()
# 經過Sequential定義
net = Sequential(
nn.Linear(5, 10),
nn.Relu(),
nn.Linear(10, 20)
)12345678910111213141516171819202122
f. 模型參數操做
# 獲取模型參數
net.parameters() #可用for 迭代
# 模型內參數梯度清零
net.zero_grad()12345
g. 定義損失函數
loss = nn.CrossEntropyLoss()1
h. 定義優化算子
optimizer = optim.SGD(net.parameters(), lr=0.01)1
i. 訓練
optimizer.zero_grad() # zero the gradient buffers
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() 12345
j. 測試
# 測試
with torch.no_grad():
output = net(input)123
k. 保存與載入
# 模型
torch.save(net, file)
net = torch.load(file)
# 參數
torch.save(model.state_dict(), file)
net = Model()
net.load_state_dict(file)12345678
4. 一個完整的機器學習流程
數據
載入數據
數據處理
構建迭代器
模型
loss
optimizer
新建/載入模型
新建
載入
直接載入模型
載入參數
新建模型
載入模型參數(對於adam等優化器,其參數也需載入)
訓練
batch訓練
for i, batch in enumerate(dataloader):
x_batch, y_batch = batch
outputs = net(x_batch)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()1234567
每隔一段時間,打印驗證集loss
每隔一段時間,存儲模型
測試
載入測試數據 數據處理 構建迭代器(可選) 放入模型,輸出結果 計算accuracy