一,基礎(chǔ)介紹
在前面的內(nèi)容中,所有的包括函數(shù)、各種層的封裝都是我們自己手動碼出來的,在實際的工程應(yīng)用中,其實有很多東西是可以重復(fù)利用的,所以有些大佬就將其封裝了起來,方便使用
深度學(xué)習(xí)框架的主要功能有以下方面:
- 提供了一組API和工具,可以方便地定義和配置神經(jīng)網(wǎng)絡(luò)模型的結(jié)構(gòu)和參數(shù),例如層、激活函數(shù)、優(yōu)化器等。
- 提供了計算引擎,可以執(zhí)行神經(jīng)網(wǎng)絡(luò)模型的前向傳播和反向傳播算法,并進行梯度計算和參數(shù)更新,從而實現(xiàn)模型的訓(xùn)練和優(yōu)化
- 提供了數(shù)據(jù)管理和預(yù)處理工具,可以加載和處理訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),并進行數(shù)據(jù)增強和批量處理等操作,從而提高模型的魯棒性和泛化性能。
- 支持在多個GPU或分布式系統(tǒng)上進行高效的并行計算和訓(xùn)練,從而加速模型的訓(xùn)練和優(yōu)化過程。
- 也支持將訓(xùn)練好的模型部署到不同的硬件平臺上,并進行推理和預(yù)測,從而實現(xiàn)模型的應(yīng)用。
常用的學(xué)習(xí)框架主要有:
- TensorFlow:是Google Brain團隊基于Google在2011年開發(fā)的深度學(xué)習(xí)基礎(chǔ)架構(gòu)DistBelief構(gòu)建的
- MXNet:亞馬遜首席科學(xué)家李沐帶領(lǐng)團隊開發(fā)的深度學(xué)習(xí)框架
- Pytorch:是一個Python優(yōu)先的深度學(xué)習(xí)框架,能夠在強大的GPU加速基礎(chǔ)上實現(xiàn)張量和動態(tài)神經(jīng)網(wǎng)絡(luò)
- PaddlePaddle(飛槳):百度自主研發(fā)、功能完備、開源開放的產(chǎn)業(yè)級深度學(xué)習(xí)平臺
通常學(xué)習(xí)一個框架即可,換框架就查一查知道怎么改API就行,此文主要說Pytorch
二,Pytorch基礎(chǔ)(引用知乎)
2.1 Tensor
就如同在numpy里面有np.array這樣的數(shù)組結(jié)構(gòu),在Pytorch里面也有,叫作tensor
代碼操作見下:
import torch #導(dǎo)入pytorch
x = torch.tensor([5.5, 3])
print(x)
# 對tensor進行操作
y = x + 2
print(y)
輸出為

2.2 GPU加速
GPU的并行計算能力使得其。PyTorch提供了簡單易用的API,讓我們可以很容易地在CPU和GPU之間切換計算。
代碼如下:
import torch
# 檢查是否有可用的GPU
if torch.cuda.is_available():
print("There is a GPU available.")
else:
print("There is no GPU available.")
# 可以把數(shù)據(jù)放到GPU上
x = x.to('cuda') #已有的數(shù)組x移到GPU
x = torch.tensor([1.0, 2.0], device='cuda') #直接在GPU上創(chuàng)建
2.3 自動求導(dǎo)
使用梯度下降法的時候,需要計算梯度,在Pytorch中非常簡單,先通過tensor.requires_grad=True表示要計算此張量的梯度,然后再調(diào)用.backward()方法,來計算和存儲梯度,最后可通過.grad來訪問
import torch
# 創(chuàng)建一個tensor并設(shè)置requires_grad=True來追蹤其計算歷史
x = torch.ones(2, 2, requires_grad=True)
#... 省略計算操作
# 使用.backward()來進行反向傳播,計算梯度
out.backward()
# 輸出梯度d(out)/dx
print(x.grad)
三,Pytorch神經(jīng)網(wǎng)絡(luò)
3.1 構(gòu)建神經(jīng)網(wǎng)絡(luò)
PyTorch提供了torch.nn庫,用于構(gòu)建神經(jīng)網(wǎng)絡(luò)的工具庫。torch.nn庫依賴于autograd庫來定義和計算梯度。nn.Module包含了神經(jīng)網(wǎng)絡(luò)的層以及返回輸出的forward(input)方法。
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 輸入圖像channel:1,輸出channel:6,5x5卷積核
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
# 全連接層
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# 使用2x2窗口進行最大池化
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# 如果窗口是方的,只需要指定一個維度
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # 獲取除了batch維度之外的其他維度
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
首先定義了一個Net類,這個類繼承自nn.Module。然后在init方法中定義了網(wǎng)絡(luò)的結(jié)構(gòu),在forward方法中定義了數(shù)據(jù)的流向
3.2 自定義數(shù)據(jù)集
自定義數(shù)據(jù)集需要繼承Dataset類,并實現(xiàn)len和getitem兩個方法。
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
def __init__(self, x_tensor, y_tensor):
self.x = x_tensor
self.y = y_tensor
def __getitem__(self, index):
return (self.x[index], self.y[index])
def __len__(self):
return len(self.x)
x = torch.arange(10)
y = torch.arange(10) + 1
my_dataset = MyDataset(x, y)
loader = DataLoader(my_dataset, batch_size=4, shuffle=True, num_workers=0)
for x, y in loader:
print("x:", x, "y:", y)
3.3 模型的保存和加載
PyTorch提供了簡單的API來保存和加載模型。最常見的方法是使用torch.save來保存模型的參數(shù),然后通過torch.load來加載模型的參數(shù)。
# 保存
torch.save(model.state_dict(), PATH)
# 加載
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
model.eval()