深度學(xué)習(xí)(八):深度學(xué)習(xí)框架

一,基礎(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)lengetitem兩個方法。

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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容