国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了

這篇具有很好參考價(jià)值的文章主要介紹了Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文通過詳細(xì)且實(shí)踐性的方式介紹了 PyTorch 的使用,包括環(huán)境安裝、基礎(chǔ)知識、張量操作、自動(dòng)求導(dǎo)機(jī)制、神經(jīng)網(wǎng)絡(luò)創(chuàng)建、數(shù)據(jù)處理、模型訓(xùn)練、測試以及模型的保存和加載。

1. Pytorch簡介

Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了

在這一部分,我們將會對Pytorch做一個(gè)簡單的介紹,包括它的歷史、優(yōu)點(diǎn)以及使用場景等。

1.1 Pytorch的歷史

PyTorch是一個(gè)由Facebook的人工智能研究團(tuán)隊(duì)開發(fā)的開源深度學(xué)習(xí)框架。在2016年發(fā)布后,PyTorch很快就因其易用性、靈活性和強(qiáng)大的功能而在科研社區(qū)中廣受歡迎。下面我們將詳細(xì)介紹PyTorch的發(fā)展歷程。

在2016年,F(xiàn)acebook的AI研究團(tuán)隊(duì)(FAIR)公開了PyTorch,其旨在提供一個(gè)快速,靈活且動(dòng)態(tài)的深度學(xué)習(xí)框架。PyTorch的設(shè)計(jì)哲學(xué)與Python的設(shè)計(jì)哲學(xué)非常相似:易讀性和簡潔性優(yōu)于隱式的復(fù)雜性。PyTorch用Python語言編寫,是Python的一種擴(kuò)展,這使得其更易于學(xué)習(xí)和使用。

PyTorch在設(shè)計(jì)上取了一些大膽的決定,其中最重要的一項(xiàng)就是選擇動(dòng)態(tài)計(jì)算圖(Dynamic Computation Graph)作為其核心。動(dòng)態(tài)計(jì)算圖與其他框架(例如TensorFlow和Theano)中的靜態(tài)計(jì)算圖有著本質(zhì)的區(qū)別,它允許我們在運(yùn)行時(shí)改變計(jì)算圖。這使得PyTorch在處理復(fù)雜模型時(shí)更具靈活性,并且對于研究人員來說,更易于理解和調(diào)試。

在發(fā)布后的幾年里,PyTorch迅速在科研社區(qū)中取得了廣泛的認(rèn)可。在2019年,PyTorch發(fā)布了1.0版本,引入了一些重要的新功能,包括支持ONNX、一個(gè)新的分布式包以及對C++的前端支持等。這些功能使得PyTorch在工業(yè)界的應(yīng)用更加廣泛,同時(shí)也保持了其在科研領(lǐng)域的強(qiáng)勁勢頭。

到了近兩年,PyTorch已經(jīng)成為全球最流行的深度學(xué)習(xí)框架之一。其在GitHub上的星標(biāo)數(shù)量超過了50k,被用在了各種各樣的項(xiàng)目中,從最新的研究論文到大規(guī)模的工業(yè)應(yīng)用。

綜上,PyTorch的發(fā)展歷程是一部充滿創(chuàng)新和挑戰(zhàn)的歷史,它從一個(gè)科研項(xiàng)目發(fā)展成為了全球最流行的深度學(xué)習(xí)框架之一。在未來,我們有理由相信,PyTorch將會在深度學(xué)習(xí)領(lǐng)域繼續(xù)發(fā)揮重要的作用。

1.2 Pytorch的優(yōu)點(diǎn)

PyTorch不僅是最受歡迎的深度學(xué)習(xí)框架之一,而且也是最強(qiáng)大的深度學(xué)習(xí)框架之一。它有許多獨(dú)特的優(yōu)點(diǎn),使其在學(xué)術(shù)界和工業(yè)界都受到廣泛的關(guān)注和使用。接下來我們就來詳細(xì)地探討一下PyTorch的優(yōu)點(diǎn)。

1. 動(dòng)態(tài)計(jì)算圖

PyTorch最突出的優(yōu)點(diǎn)之一就是它使用了動(dòng)態(tài)計(jì)算圖(Dynamic Computation Graphs,DCGs),與TensorFlow和其他框架使用的靜態(tài)計(jì)算圖不同。動(dòng)態(tài)計(jì)算圖允許你在運(yùn)行時(shí)更改圖的行為。這使得PyTorch非常靈活,在處理不確定性或復(fù)雜性時(shí)具有優(yōu)勢,因此非常適合研究和原型設(shè)計(jì)。

2. 易用性

PyTorch被設(shè)計(jì)成易于理解和使用。其API設(shè)計(jì)的直觀性使得學(xué)習(xí)和使用PyTorch成為一件非常愉快的事情。此外,由于PyTorch與Python的深度集成,它在Python程序員中非常流行。

3. 易于調(diào)試

由于PyTorch的動(dòng)態(tài)性和Python性質(zhì),調(diào)試PyTorch程序變得相當(dāng)直接。你可以使用Python的標(biāo)準(zhǔn)調(diào)試工具,如PDB或PyCharm,直接查看每個(gè)操作的結(jié)果和中間變量的狀態(tài)。

4. 強(qiáng)大的社區(qū)支持

PyTorch的社區(qū)非?;钴S和支持。官方論壇、GitHub、Stack Overflow等平臺上有大量的PyTorch用戶和開發(fā)者,你可以從中找到大量的資源和幫助。

5. 廣泛的預(yù)訓(xùn)練模型

PyTorch提供了大量的預(yù)訓(xùn)練模型,包括但不限于ResNet,VGG,Inception,SqueezeNet,EfficientNet等等。這些預(yù)訓(xùn)練模型可以幫助你快速開始新的項(xiàng)目。

6. 高效的GPU利用

PyTorch可以非常高效地利用NVIDIA的CUDA庫來進(jìn)行GPU計(jì)算。同時(shí),它還支持分布式計(jì)算,讓你可以在多個(gè)GPU或服務(wù)器上訓(xùn)練模型。

綜上所述,PyTorch因其易用性、靈活性、豐富的功能以及強(qiáng)大的社區(qū)支持,在深度學(xué)習(xí)領(lǐng)域中備受歡迎。

1.3 Pytorch的使用場景

PyTorch的強(qiáng)大功能和靈活性使其在許多深度學(xué)習(xí)應(yīng)用場景中都能夠發(fā)揮重要作用。以下是PyTorch在各種應(yīng)用中的一些典型用例:

1. 計(jì)算機(jī)視覺

在計(jì)算機(jī)視覺方面,PyTorch提供了許多預(yù)訓(xùn)練模型(如ResNet,VGG,Inception等)和工具(如TorchVision),可以用于圖像分類、物體檢測、語義分割和圖像生成等任務(wù)。這些預(yù)訓(xùn)練模型和工具大大簡化了開發(fā)計(jì)算機(jī)視覺應(yīng)用的過程。

2. 自然語言處理

在自然語言處理(NLP)領(lǐng)域,PyTorch的動(dòng)態(tài)計(jì)算圖特性使得其非常適合處理變長輸入,這對于許多NLP任務(wù)來說是非常重要的。同時(shí),PyTorch也提供了一系列的NLP工具和預(yù)訓(xùn)練模型(如Transformer,BERT等),可以幫助我們處理文本分類、情感分析、命名實(shí)體識別、機(jī)器翻譯和問答系統(tǒng)等任務(wù)。

3. 生成對抗網(wǎng)絡(luò)

生成對抗網(wǎng)絡(luò)(GANs)是一種強(qiáng)大的深度學(xué)習(xí)模型,被廣泛應(yīng)用于圖像生成、圖像到圖像的轉(zhuǎn)換、樣式遷移和數(shù)據(jù)增強(qiáng)等任務(wù)。PyTorch的靈活性使得其非常適合開發(fā)和訓(xùn)練GAN模型。

4. 強(qiáng)化學(xué)習(xí)

強(qiáng)化學(xué)習(xí)是一種學(xué)習(xí)方法,其中智能體通過與環(huán)境的交互來學(xué)習(xí)如何執(zhí)行任務(wù)。PyTorch的動(dòng)態(tài)計(jì)算圖和易于使用的API使得其在實(shí)現(xiàn)強(qiáng)化學(xué)習(xí)算法時(shí)表現(xiàn)出極高的效率。

5. 時(shí)序數(shù)據(jù)分析

在處理時(shí)序數(shù)據(jù)的任務(wù)中,如語音識別、時(shí)間序列預(yù)測等,PyTorch的動(dòng)態(tài)計(jì)算圖為處理可變長度的序列數(shù)據(jù)提供了便利。同時(shí),PyTorch提供了包括RNN、LSTM、GRU在內(nèi)的各種循環(huán)神經(jīng)網(wǎng)絡(luò)模型。

總的來說,PyTorch憑借其強(qiáng)大的功能和極高的靈活性,在許多深度學(xué)習(xí)的應(yīng)用場景中都能夠發(fā)揮重要作用。無論你是在研究新的深度學(xué)習(xí)模型,還是在開發(fā)實(shí)際的深度學(xué)習(xí)應(yīng)用,PyTorch都能夠提供強(qiáng)大的支持。

2. Pytorch基礎(chǔ)

Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了

在我們開始深入使用PyTorch之前,讓我們先了解一些基礎(chǔ)概念和操作。這一部分將涵蓋PyTorch的基礎(chǔ),包括tensor操作、GPU加速以及自動(dòng)求導(dǎo)機(jī)制。

2.1 Tensor操作

Tensor是PyTorch中最基本的數(shù)據(jù)結(jié)構(gòu),你可以將其視為多維數(shù)組或者矩陣。PyTorch tensor和NumPy array非常相似,但是tensor還可以在GPU上運(yùn)算,而NumPy array則只能在CPU上運(yùn)算。下面,我們將介紹一些基本的tensor操作。

首先,我們需要導(dǎo)入PyTorch庫:

import torch

然后,我們可以創(chuàng)建一個(gè)新的tensor。以下是一些創(chuàng)建tensor的方法:

# 創(chuàng)建一個(gè)未初始化的5x3矩陣
x = torch.empty(5, 3)
print(x)

# 創(chuàng)建一個(gè)隨機(jī)初始化的5x3矩陣
x = torch.rand(5, 3)
print(x)

# 創(chuàng)建一個(gè)5x3的零矩陣,類型為long
x = torch.zeros(5, 3, dtype=torch.long)
print(x)

# 直接從數(shù)據(jù)創(chuàng)建tensor
x = torch.tensor([5.5, 3])
print(x)

我們還可以對已有的tensor進(jìn)行操作。以下是一些基本操作:

# 創(chuàng)建一個(gè)tensor,并設(shè)置requires_grad=True以跟蹤計(jì)算歷史
x = torch.ones(2, 2, requires_grad=True)
print(x)

# 對tensor進(jìn)行操作
y = x + 2
print(y)

# y是操作的結(jié)果,所以它有g(shù)rad_fn屬性
print(y.grad_fn)

# 對y進(jìn)行更多操作
z = y * y * 3
out = z.mean()

print(z, out)

上述操作的結(jié)果如下:

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x7f36c0a7f1d0>
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

在PyTorch中,我們可以使用.backward()方法來計(jì)算梯度。例如:

# 因?yàn)閛ut包含一個(gè)標(biāo)量,out.backward()等價(jià)于out.backward(torch.tensor(1.))
out.backward()

# 打印梯度 d(out)/dx
print(x.grad)

以上是PyTorch tensor的基本操作,我們可以看到PyTorch tensor操作非常簡單和直觀。在后續(xù)的學(xué)習(xí)中,我們將會使用到更多的tensor操作,例如索引、切片、數(shù)學(xué)運(yùn)算、線性代數(shù)、隨機(jī)數(shù)等等。

2.2 GPU加速

在深度學(xué)習(xí)訓(xùn)練中,GPU(圖形處理器)加速是非常重要的一部分。GPU的并行計(jì)算能力使得其比CPU在大規(guī)模矩陣運(yùn)算上更具優(yōu)勢。PyTorch提供了簡單易用的API,讓我們可以很容易地在CPU和GPU之間切換計(jì)算。

首先,我們需要檢查系統(tǒng)中是否存在可用的GPU。在PyTorch中,我們可以使用torch.cuda.is_available()來檢查:

import torch

# 檢查是否有可用的GPU
if torch.cuda.is_available():
    print("There is a GPU available.")
else:
    print("There is no GPU available.")

如果存在可用的GPU,我們可以使用.to()方法將tensor移動(dòng)到GPU上:

# 創(chuàng)建一個(gè)tensor
x = torch.tensor([1.0, 2.0])

# 移動(dòng)tensor到GPU上
if torch.cuda.is_available():
    x = x.to('cuda')

我們也可以直接在創(chuàng)建tensor的時(shí)候就指定其設(shè)備:

# 直接在GPU上創(chuàng)建tensor
if torch.cuda.is_available():
    x = torch.tensor([1.0, 2.0], device='cuda')

在進(jìn)行模型訓(xùn)練時(shí),我們通常會將模型和數(shù)據(jù)都移動(dòng)到GPU上:

# 創(chuàng)建一個(gè)簡單的模型
model = torch.nn.Linear(10, 1)

# 創(chuàng)建一些數(shù)據(jù)
data = torch.randn(100, 10)

# 移動(dòng)模型和數(shù)據(jù)到GPU
if torch.cuda.is_available():
    model = model.to('cuda')
    data = data.to('cuda')

以上就是在PyTorch中進(jìn)行GPU加速的基本操作。使用GPU加速可以顯著提高深度學(xué)習(xí)模型的訓(xùn)練速度。但需要注意的是,數(shù)據(jù)在CPU和GPU之間的傳輸會消耗一定的時(shí)間,因此我們應(yīng)該盡量減少數(shù)據(jù)的傳輸次數(shù)。

2.3 自動(dòng)求導(dǎo)

在深度學(xué)習(xí)中,我們經(jīng)常需要進(jìn)行梯度下降優(yōu)化。這就需要我們計(jì)算梯度,也就是函數(shù)的導(dǎo)數(shù)。在PyTorch中,我們可以使用自動(dòng)求導(dǎo)機(jī)制(autograd)來自動(dòng)計(jì)算梯度。

在PyTorch中,我們可以設(shè)置tensor.requires_grad=True來追蹤其上的所有操作。完成計(jì)算后,我們可以調(diào)用.backward()方法,PyTorch會自動(dòng)計(jì)算和存儲梯度。這個(gè)梯度可以通過.grad屬性進(jìn)行訪問。

下面是一個(gè)簡單的示例:

import torch

# 創(chuàng)建一個(gè)tensor并設(shè)置requires_grad=True來追蹤其計(jì)算歷史
x = torch.ones(2, 2, requires_grad=True)

# 對這個(gè)tensor做一次運(yùn)算:
y = x + 2

# y是計(jì)算的結(jié)果,所以它有g(shù)rad_fn屬性
print(y.grad_fn)

# 對y進(jìn)行更多的操作
z = y * y * 3
out = z.mean()

print(z, out)

# 使用.backward()來進(jìn)行反向傳播,計(jì)算梯度
out.backward()

# 輸出梯度d(out)/dx
print(x.grad)

以上示例中,out.backward()等同于out.backward(torch.tensor(1.))。如果out不是一個(gè)標(biāo)量,因?yàn)閠ensor是矩陣,那么在調(diào)用.backward()時(shí)需要傳入一個(gè)與out同形的權(quán)重向量進(jìn)行相乘。

例如:

x = torch.randn(3, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

以上就是PyTorch中自動(dòng)求導(dǎo)的基本使用方法。自動(dòng)求導(dǎo)是PyTorch的重要特性之一,它為深度學(xué)習(xí)模型的訓(xùn)練提供了極大的便利。

3. PyTorch 神經(jīng)網(wǎng)絡(luò)

Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了

在掌握了PyTorch的基本使用方法之后,我們將探索一些更為高級的特性和用法。這些高級特性包括神經(jīng)網(wǎng)絡(luò)構(gòu)建、數(shù)據(jù)加載以及模型保存和加載等等。

3.1 構(gòu)建神經(jīng)網(wǎng)絡(luò)

PyTorch提供了torch.nn庫,它是用于構(gòu)建神經(jīng)網(wǎng)絡(luò)的工具庫。torch.nn庫依賴于autograd庫來定義和計(jì)算梯度。nn.Module包含了神經(jīng)網(wǎng)絡(luò)的層以及返回輸出的forward(input)方法。

以下是一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)的構(gòu)建示例:

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窗口進(jìn)行最大池化
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # 如果窗口是方的,只需要指定一個(gè)維度
        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)

以上就是一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)的構(gòu)建方法。我們首先定義了一個(gè)Net類,這個(gè)類繼承自nn.Module。然后在__init__方法中定義了網(wǎng)絡(luò)的結(jié)構(gòu),在forward方法中定義了數(shù)據(jù)的流向。在網(wǎng)絡(luò)的構(gòu)建過程中,我們可以使用任何tensor操作。

需要注意的是,backward函數(shù)(用于計(jì)算梯度)會被autograd自動(dòng)創(chuàng)建和實(shí)現(xiàn)。你只需要在nn.Module的子類中定義forward函數(shù)。

在創(chuàng)建好神經(jīng)網(wǎng)絡(luò)后,我們可以使用net.parameters()方法來返回網(wǎng)絡(luò)的可學(xué)習(xí)參數(shù)。

3.2 數(shù)據(jù)加載和處理

在深度學(xué)習(xí)項(xiàng)目中,除了模型設(shè)計(jì)之外,數(shù)據(jù)的加載和處理也是非常重要的一部分。PyTorch提供了torch.utils.data.DataLoader類,可以幫助我們方便地進(jìn)行數(shù)據(jù)的加載和處理。

3.2.1 DataLoader介紹

DataLoader類提供了對數(shù)據(jù)集的并行加載,可以有效地加載大量數(shù)據(jù),并提供了多種數(shù)據(jù)采樣方式。常用的參數(shù)有:

  • dataset:加載的數(shù)據(jù)集(Dataset對象)
  • batch_size:batch大小
  • shuffle:是否每個(gè)epoch時(shí)都打亂數(shù)據(jù)
  • num_workers:使用多進(jìn)程加載的進(jìn)程數(shù),0表示不使用多進(jìn)程

以下是一個(gè)簡單的使用示例:

from torch.utils.data import DataLoader
from torchvision import datasets, transforms

# 數(shù)據(jù)轉(zhuǎn)換
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 下載并加載訓(xùn)練集
trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)

# 下載并加載測試集
testset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)

3.2.2 自定義數(shù)據(jù)集

除了使用內(nèi)置的數(shù)據(jù)集,我們也可以自定義數(shù)據(jù)集。自定義數(shù)據(jù)集需要繼承Dataset類,并實(shí)現(xiàn)__len____getitem__兩個(gè)方法。

以下是一個(gè)自定義數(shù)據(jù)集的簡單示例:

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)

這個(gè)例子中,我們創(chuàng)建了一個(gè)簡單的數(shù)據(jù)集,包含10個(gè)數(shù)據(jù)。然后我們使用DataLoader加載數(shù)據(jù),并設(shè)置了batch大小和shuffle參數(shù)。

以上就是PyTorch中數(shù)據(jù)加載和處理的主要方法,通過這些方法,我們可以方便地對數(shù)據(jù)進(jìn)行加載和處理。

3.3 模型的保存和加載

在深度學(xué)習(xí)模型的訓(xùn)練過程中,我們經(jīng)常需要保存模型的參數(shù)以便于將來重新加載。這對于中斷的訓(xùn)練過程的恢復(fù),或者用于模型的分享和部署都是非常有用的。

PyTorch提供了簡單的API來保存和加載模型。最常見的方法是使用torch.save來保存模型的參數(shù),然后通過torch.load來加載模型的參數(shù)。

3.3.1 保存和加載模型參數(shù)

以下是一個(gè)簡單的示例:

# 保存
torch.save(model.state_dict(), PATH)

# 加載
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
model.eval()

在保存模型參數(shù)時(shí),我們通常使用.state_dict()方法來獲取模型的參數(shù)。.state_dict()是一個(gè)從參數(shù)名字映射到參數(shù)值的字典對象。

在加載模型參數(shù)時(shí),我們首先需要實(shí)例化一個(gè)和原模型結(jié)構(gòu)相同的模型,然后使用.load_state_dict()方法加載參數(shù)。

請注意,load_state_dict()函數(shù)接受一個(gè)字典對象,而不是保存對象的路徑。這意味著在你傳入load_state_dict()函數(shù)之前,你必須反序列化你的保存的state_dict

在加載模型后,我們通常調(diào)用.eval()方法將dropout和batch normalization層設(shè)置為評估模式。否則,它們會在評估模式下保持訓(xùn)練模式。

3.3.2 保存和加載整個(gè)模型

除了保存模型的參數(shù),我們也可以保存整個(gè)模型。

# 保存
torch.save(model, PATH)

# 加載
model = torch.load(PATH)
model.eval()

保存整個(gè)模型會將模型的結(jié)構(gòu)和參數(shù)一起保存。這意味著在加載模型時(shí),我們不再需要手動(dòng)創(chuàng)建模型實(shí)例。但是,這種方式需要更多的磁盤空間,并且可能在某些情況下導(dǎo)致代碼的混亂,所以并不總是推薦的。

以上就是PyTorch中模型的保存和加載的基本方法。適當(dāng)?shù)谋4婧图虞d模型可以幫助我們更好地進(jìn)行模型的訓(xùn)練和評估。

4. PyTorch GPT加速

Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了
掌握了PyTorch的基礎(chǔ)和高級用法之后,我們現(xiàn)在要探討一些PyTorch的進(jìn)階技巧,幫助我們更好地理解和使用這個(gè)強(qiáng)大的深度學(xué)習(xí)框架。

4.1 使用GPU加速

PyTorch支持使用GPU進(jìn)行計(jì)算,這可以大大提高訓(xùn)練和推理的速度。使用GPU進(jìn)行計(jì)算的核心就是將Tensor和模型轉(zhuǎn)移到GPU上。

4.1.1 判斷是否支持GPU

首先,我們需要判斷當(dāng)前的環(huán)境是否支持GPU。這可以通過torch.cuda.is_available()來實(shí)現(xiàn):

print(torch.cuda.is_available())  # 輸出:True 或 False

4.1.2 Tensor在CPU和GPU之間轉(zhuǎn)移

如果支持GPU,我們可以使用.to(device).cuda()方法將Tensor轉(zhuǎn)移到GPU上。同樣,我們也可以使用.cpu()方法將Tensor轉(zhuǎn)移到CPU上:

# 判斷是否支持CUDA
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 創(chuàng)建一個(gè)Tensor
x = torch.rand(3, 3)

# 將Tensor轉(zhuǎn)移到GPU上
x_gpu = x.to(device)

# 或者
x_gpu = x.cuda()

# 將Tensor轉(zhuǎn)移到CPU上
x_cpu = x_gpu.cpu()

4.1.3 將模型轉(zhuǎn)移到GPU上

類似的,我們也可以將模型轉(zhuǎn)移到GPU上:

model = Model()
model.to(device)

當(dāng)模型在GPU上時(shí),我們需要確保輸入的Tensor也在GPU上,否則會報(bào)錯(cuò)。

注意,將模型轉(zhuǎn)移到GPU上后,模型的所有參數(shù)和緩沖區(qū)都會轉(zhuǎn)移到GPU上。

以上就是使用GPU進(jìn)行計(jì)算的基本方法。通過合理的使用GPU,我們可以大大提高模型的訓(xùn)練和推理速度。

4.2 使用torchvision進(jìn)行圖像操作

torchvision是一個(gè)獨(dú)立于PyTorch的包,提供了大量的圖像數(shù)據(jù)集,圖像處理工具和預(yù)訓(xùn)練模型等。

4.2.1 torchvision.datasets

torchvision.datasets模塊提供了各種公共數(shù)據(jù)集,如CIFAR10、MNIST、ImageNet等,我們可以非常方便地下載和使用這些數(shù)據(jù)集。例如,下面的代碼展示了如何下載和加載CIFAR10數(shù)據(jù)集:

from torchvision import datasets, transforms

# 數(shù)據(jù)轉(zhuǎn)換
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 下載并加載訓(xùn)練集
trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)

# 下載并加載測試集
testset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)

4.2.2 torchvision.transforms

torchvision.transforms模塊提供了各種圖像轉(zhuǎn)換的工具,我們可以使用這些工具進(jìn)行圖像預(yù)處理和數(shù)據(jù)增強(qiáng)。例如,上面的代碼中,我們使用了Compose函數(shù)來組合了兩個(gè)圖像處理操作:ToTensor(將圖像轉(zhuǎn)換為Tensor)和Normalize(標(biāo)準(zhǔn)化圖像)。

4.2.3 torchvision.models

torchvision.models模塊提供了預(yù)訓(xùn)練的模型,如ResNet、VGG、AlexNet等。我們可以非常方便地加載這些模型,并使用這些模型進(jìn)行遷移學(xué)習(xí)。

import torchvision.models as models

# 加載預(yù)訓(xùn)練的resnet18模型
resnet18 = models.resnet18(pretrained=True)

以上就是torchvision的基本使用,它為我們提供了非常豐富的工具,可以大大提升我們處理圖像數(shù)據(jù)的效率。

4.3 使用TensorBoard進(jìn)行可視化

TensorBoard 是一個(gè)可視化工具,它可以幫助我們更好地理解,優(yōu)化,和調(diào)試深度學(xué)習(xí)模型。PyTorch 提供了對 TensorBoard 的支持,我們可以非常方便地使用 TensorBoard 來監(jiān)控模型的訓(xùn)練過程,比較不同模型的性能,可視化模型結(jié)構(gòu),等等。

4.3.1 啟動(dòng) TensorBoard

要啟動(dòng) TensorBoard,我們需要在命令行中運(yùn)行 tensorboard --logdir=runs 命令,其中 runs 是保存 TensorBoard 數(shù)據(jù)的目錄。

4.3.2 記錄數(shù)據(jù)

我們可以使用 torch.utils.tensorboard 模塊來記錄數(shù)據(jù)。首先,我們需要?jiǎng)?chuàng)建一個(gè) SummaryWriter 對象,然后通過這個(gè)對象的方法來記錄數(shù)據(jù)。

from torch.utils.tensorboard import SummaryWriter

# 創(chuàng)建一個(gè) SummaryWriter 對象
writer = SummaryWriter('runs/experiment1')

# 使用 writer 來記錄數(shù)據(jù)
for n_iter in range(100):
    writer.add_scalar('Loss/train', np.random.random(), n_iter)
    writer.add_scalar('Loss/test', np.random.random(), n_iter)
    writer.add_scalar('Accuracy/train', np.random.random(), n_iter)
    writer.add_scalar('Accuracy/test', np.random.random(), n_iter)

# 關(guān)閉 writer
writer.close()

4.3.3 可視化模型結(jié)構(gòu)

我們也可以使用 TensorBoard 來可視化模型結(jié)構(gòu)。

# 添加模型
writer.add_graph(model, images)

4.3.4 可視化高維數(shù)據(jù)

我們還可以使用 TensorBoard 的嵌入功能來可視化高維數(shù)據(jù),如圖像特征、詞嵌入等。

# 添加嵌入
writer.add_embedding(features, metadata=class_labels, label_img=images)

以上就是 TensorBoard 的基本使用方法。通過使用 TensorBoard,我們可以更好地理解和優(yōu)化我們的模型。

5. PyTorch實(shí)戰(zhàn)案例

Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了

在這一部分中,我們將通過一個(gè)實(shí)戰(zhàn)案例來詳細(xì)介紹如何使用PyTorch進(jìn)行深度學(xué)習(xí)模型的開發(fā)。我們將使用CIFAR10數(shù)據(jù)集來訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)。

5.1 數(shù)據(jù)加載和預(yù)處理

首先,我們需要加載數(shù)據(jù)并進(jìn)行預(yù)處理。我們將使用torchvision包來下載CIFAR10數(shù)據(jù)集,并使用transforms模塊來對數(shù)據(jù)進(jìn)行預(yù)處理。

import torch
from torchvision import datasets, transforms

# 定義數(shù)據(jù)預(yù)處理操作
transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),  # 數(shù)據(jù)增強(qiáng):隨機(jī)翻轉(zhuǎn)圖片
    transforms.RandomCrop(32, padding=4),  # 數(shù)據(jù)增強(qiáng):隨機(jī)裁剪圖片
    transforms.ToTensor(),  # 將PIL.Image或者numpy.ndarray數(shù)據(jù)類型轉(zhuǎn)化為torch.FloadTensor,并歸一化到[0.0, 1.0]
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))  # 標(biāo)準(zhǔn)化(這里的均值和標(biāo)準(zhǔn)差是CIFAR10數(shù)據(jù)集的)
])

# 下載并加載訓(xùn)練數(shù)據(jù)集
trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2)

# 下載并加載測試數(shù)據(jù)集
testset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False, num_workers=2)

在這段代碼中,我們首先定義了一系列的數(shù)據(jù)預(yù)處理操作,然后使用datasets.CIFAR10來下載CIFAR10數(shù)據(jù)集并進(jìn)行預(yù)處理,最后使用torch.utils.data.DataLoader來創(chuàng)建數(shù)據(jù)加載器,它可以幫助我們在訓(xùn)練過程中按照批次獲取數(shù)據(jù)。

5.2 定義網(wǎng)絡(luò)模型

接下來,我們定義我們的卷積神經(jīng)網(wǎng)絡(luò)模型。在這個(gè)案例中,我們將使用兩個(gè)卷積層和兩個(gè)全連接層。

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)  # 輸入通道數(shù)3,輸出通道數(shù)6,卷積核大小5
        self.pool = nn.MaxPool2d(2, 2)  # 最大池化,核大小2,步長2
        self.conv2 = nn.Conv2d(6, 16, 5)  # 輸入通道數(shù)6,輸出通道數(shù)16,卷積核大小5
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 全連接層,輸入維度16*5*5,輸出維度120
        self.fc2 = nn.Linear(120, 84)  # 全連接層,輸入維度120,輸出維度84
        self.fc3 = nn.Linear(84, 10)  # 全連接層,輸入維度84,輸出維度10(CIFAR10有10類)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))  # 第一層卷積+ReLU激活函數(shù)+池化
        x = self.pool(F.relu(self.conv2(x)))  # 第二層卷積+ReLU激活函數(shù)+池化
        x = x.view(-1, 16 * 5 * 5)  # 將特征圖展平
        x = F.relu(self.fc1(x))  # 第一層全連接+ReLU激活函數(shù)
        x = F.relu(self.fc2(x))  # 第二層全連接+ReLU激活函數(shù)
        x = self.fc3(x)  # 第三層全連接
        return x

# 創(chuàng)建網(wǎng)絡(luò)
net = Net()

在這個(gè)網(wǎng)絡(luò)模型中,我們使用nn.Module來定義我們的網(wǎng)絡(luò)模型,然后在__init__方法中定義網(wǎng)絡(luò)的層,最后在forward方法中定義網(wǎng)絡(luò)的前向傳播過程。

5.3 定義損失函數(shù)和優(yōu)化器

現(xiàn)在我們已經(jīng)有了數(shù)據(jù)和模型,下一步我們需要定義損失函數(shù)和優(yōu)化器。損失函數(shù)用于衡量模型的預(yù)測與真實(shí)標(biāo)簽的差距,優(yōu)化器則用于優(yōu)化模型的參數(shù)以減少損失。

在這個(gè)案例中,我們將使用交叉熵?fù)p失函數(shù)(Cross Entropy Loss)和隨機(jī)梯度下降優(yōu)化器(Stochastic Gradient Descent,SGD)。

import torch.optim as optim

# 定義損失函數(shù)
criterion = nn.CrossEntropyLoss()

# 定義優(yōu)化器
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

在這段代碼中,我們首先使用nn.CrossEntropyLoss來定義損失函數(shù),然后使用optim.SGD來定義優(yōu)化器。我們需要將網(wǎng)絡(luò)的參數(shù)傳遞給優(yōu)化器,然后設(shè)置學(xué)習(xí)率和動(dòng)量。

5.4 訓(xùn)練網(wǎng)絡(luò)

一切準(zhǔn)備就緒后,我們開始訓(xùn)練網(wǎng)絡(luò)。在訓(xùn)練過程中,我們首先通過網(wǎng)絡(luò)進(jìn)行前向傳播得到輸出,然后計(jì)算輸出與真實(shí)標(biāo)簽的損失,接著通過后向傳播計(jì)算梯度,最后使用優(yōu)化器更新模型參數(shù)。

for epoch in range(2):  # 在數(shù)據(jù)集上訓(xùn)練兩遍

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # 獲取輸入數(shù)據(jù)
        inputs, labels = data

        # 梯度清零
        optimizer.zero_grad()

        # 前向傳播
        outputs = net(inputs)

        # 計(jì)算損失
        loss = criterion(outputs, labels)

        # 反向傳播
        loss.backward()

        # 更新參數(shù)
        optimizer.step()

        # 打印統(tǒng)計(jì)信息
        running_loss += loss.item()
        if i % 2000 == 1999:  # 每2000個(gè)批次打印一次
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

在這段代碼中,我們首先對數(shù)據(jù)集進(jìn)行兩輪訓(xùn)練。在每輪訓(xùn)練中,我們遍歷數(shù)據(jù)加載器,獲取一批數(shù)據(jù),然后通過網(wǎng)絡(luò)進(jìn)行前向傳播得到輸出,計(jì)算損失,進(jìn)行反向傳播,最后更新參數(shù)。我們還在每2000個(gè)批次后打印一次損失信息,以便我們了解訓(xùn)練過程。

5.5 測試網(wǎng)絡(luò)

訓(xùn)練完成后,我們需要在測試集上測試網(wǎng)絡(luò)的性能。這可以讓我們了解模型在未見過的數(shù)據(jù)上的表現(xiàn)如何,以評估其泛化能力。

# 加載一些測試圖片
dataiter = iter(testloader)
images, labels = dataiter.next()

# 打印圖片
imshow(torchvision.utils.make_grid(images))

# 顯示真實(shí)的標(biāo)簽
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))

# 讓網(wǎng)絡(luò)做出預(yù)測
outputs = net(images)

# 預(yù)測的標(biāo)簽是最大輸出的標(biāo)簽
_, predicted = torch.max(outputs, 1)

# 顯示預(yù)測的標(biāo)簽
print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))

# 在整個(gè)測試集上測試網(wǎng)絡(luò)
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

在這段代碼中,我們首先加載一些測試圖片,并打印出真實(shí)的標(biāo)簽。然后我們讓網(wǎng)絡(luò)對這些圖片做出預(yù)測,并打印出預(yù)測的標(biāo)簽。最后,我們在整個(gè)測試集上測試網(wǎng)絡(luò),并打印出網(wǎng)絡(luò)在測試集上的準(zhǔn)確率。

5.6 保存和加載模型

在訓(xùn)練完網(wǎng)絡(luò)并且對其進(jìn)行了測試后,我們可能希望保存訓(xùn)練好的模型,以便于將來使用,或者繼續(xù)訓(xùn)練。

# 保存模型
torch.save(net.state_dict(), './cifar_net.pth')

在這段代碼中,我們使用torch.save函數(shù),將訓(xùn)練好的模型參數(shù)(通過net.state_dict()獲得)保存到文件中。

當(dāng)我們需要加載模型時(shí),首先需要?jiǎng)?chuàng)建一個(gè)新的模型實(shí)例,然后使用load_state_dict方法將參數(shù)加載到模型中。

# 加載模型
net = Net()  # 創(chuàng)建新的網(wǎng)絡(luò)實(shí)例
net.load_state_dict(torch.load('./cifar_net.pth'))  # 加載模型參數(shù)

需要注意的是,load_state_dict方法加載的是模型的參數(shù),而不是模型本身。因此,在加載模型參數(shù)之前,你需要先創(chuàng)建一個(gè)模型實(shí)例,這個(gè)模型需要與保存的模型具有相同的結(jié)構(gòu)。

6. 總結(jié)

這篇文章通過詳細(xì)且實(shí)踐性的方式介紹了 PyTorch 的使用,包括環(huán)境安裝、基礎(chǔ)知識、張量操作、自動(dòng)求導(dǎo)機(jī)制、神經(jīng)網(wǎng)絡(luò)創(chuàng)建、數(shù)據(jù)處理、模型訓(xùn)練、測試以及模型的保存和加載。

我們利用 PyTorch 從頭到尾完成了一個(gè)完整的神經(jīng)網(wǎng)絡(luò)訓(xùn)練流程,并在 CIFAR10 數(shù)據(jù)集上測試了網(wǎng)絡(luò)的性能。在這個(gè)過程中,我們深入了解了 PyTorch 提供的各種功能和工具。

希望這篇文章能對你學(xué)習(xí) PyTorch 提供幫助,對于想要更深入了解 PyTorch 的讀者,我建議參考 PyTorch 的官方文檔以及各種開源教程。實(shí)踐是最好的學(xué)習(xí)方法,只有通過大量的練習(xí)和實(shí)踐,才能真正掌握 PyTorch 和深度學(xué)習(xí)。

謝謝你的閱讀,希望你在深度學(xué)習(xí)的道路上越走越遠(yuǎn)!

如有幫助,請多關(guān)注
個(gè)人微信公眾號:【TechLead】分享AI與云服務(wù)研發(fā)的全維度知識,談?wù)勎易鳛門echLead對技術(shù)的獨(dú)特洞察。
TeahLead KrisChang,10+年的互聯(lián)網(wǎng)和人工智能從業(yè)經(jīng)驗(yàn),10年+技術(shù)和業(yè)務(wù)團(tuán)隊(duì)管理經(jīng)驗(yàn),同濟(jì)軟件工程本科,復(fù)旦工程管理碩士,阿里云認(rèn)證云服務(wù)資深架構(gòu)師,上億營收AI產(chǎn)品業(yè)務(wù)負(fù)責(zé)人。文章來源地址http://www.zghlxwxcb.cn/news/detail-618168.html

到了這里,關(guān)于Pytorch 最全入門介紹,Pytorch入門看這一篇就夠了的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 最全TikTok開戶攻略!TikTok廣告戶怎么開通?看這一篇就夠了

    最全TikTok開戶攻略!TikTok廣告戶怎么開通?看這一篇就夠了

    TikTok?Ads?是?tiktok廣告投放的管理后臺,匯集多款海外流量產(chǎn)品,大家都清楚想要在?tiktok?上獲得更好的流量,就要通過?tiktok?的廣告投放系統(tǒng)進(jìn)行曝光,也就是說需要我們開通?tiktok廣告戶,那么要怎么開通?tiktok?廣告戶呢?今天就和東哥一起來了解一下! 目前,跨境電

    2024年02月02日
    瀏覽(16)
  • 全網(wǎng)最全的微服務(wù)鏈路追蹤實(shí)踐-SkyWalking(看這一篇就夠了)

    全網(wǎng)最全的微服務(wù)鏈路追蹤實(shí)踐-SkyWalking(看這一篇就夠了)

    鏈路追蹤介紹 對于一個(gè)大型的幾十個(gè)、幾百個(gè)微服務(wù)構(gòu)成的微服務(wù)架構(gòu)系統(tǒng),通常會遇到下面一些問題,比如: 1. 如何串聯(lián)整個(gè)調(diào)用鏈路,快速定位問題? 2. 如何縷清各個(gè)微服務(wù)之間的依賴關(guān)系? 3. 如何進(jìn)行各個(gè)微服務(wù)接口的性能分折? 4. 如何跟蹤整個(gè)業(yè)務(wù)流程的調(diào)用處

    2024年02月03日
    瀏覽(27)
  • JavaScript 入門(簡單易懂) 看這一篇就夠了

    目錄 1、什么是JavaScript 1.1、概述 1.2、歷史 2、快速入門 2.1、引入引入JavaScript 2.2、基本語法 2.3、數(shù)據(jù)類型 2.4、嚴(yán)格檢查模式 3、數(shù)據(jù)類型 3.1、字符串 3.2、數(shù)組 3.3、對象 3.4、流程控制 3.5、Map和Set 3.6 iterator 3.7數(shù)據(jù)類型轉(zhuǎn)換字符串類型 3.8數(shù)據(jù)類型轉(zhuǎn)換數(shù)字型(重點(diǎn)) 3.9標(biāo)識

    2024年02月02日
    瀏覽(22)
  • Python辦公自動(dòng)化之Word文檔自動(dòng)化:全網(wǎng)最全,看這一篇就夠了

    Python辦公自動(dòng)化之Word文檔自動(dòng)化:全網(wǎng)最全,看這一篇就夠了

    目錄 一、環(huán)境安裝 1、升級pip 2、python-docx 3、win32com 4、mailmerge 5、matplotlib 二、Python-docx 新建文檔 三、Python-docx 編輯已存在文檔 四、win32com 將 doc 轉(zhuǎn)為 docx 五、win32com 操作 word 1、打開新的word文檔并添加內(nèi)容 2、打開已存在word文檔并添加內(nèi)容 3、轉(zhuǎn)換word為pdf 六、Python-docx 操作

    2024年02月01日
    瀏覽(55)
  • 大數(shù)據(jù)超全面入門干貨知識,看這一篇就夠了!

    大數(shù)據(jù)超全面入門干貨知識,看這一篇就夠了!

    隨著科技的飛速發(fā)展和互聯(lián)網(wǎng)的普及,大數(shù)據(jù)已成為 21 世紀(jì)最炙手可熱的話題之一。它像一面神秘的面紗,覆蓋著現(xiàn)實(shí)世界,隱藏著無窮無盡的可能性。今天將帶領(lǐng)大家一起揭開大數(shù)據(jù)這個(gè)未知世界的神秘面紗,帶你了解大數(shù)據(jù)的概念、應(yīng)用以及大數(shù)據(jù)相關(guān)組件。 大數(shù)據(jù)是

    2024年04月26日
    瀏覽(29)
  • vue中axios的介紹及封裝(看這一篇就夠了!)

    vue中axios的介紹及封裝(看這一篇就夠了!)

    ???個(gè)人主頁:前端青山 ??系列專欄:Vue篇 ?? 人終將被年少不可得之物困其一生 依舊 青山 ,本期給大家?guī)韛ue篇專欄內(nèi)容:vue-axios 目錄 一、axios是什么 二、實(shí)現(xiàn)一個(gè)簡易版axios 三、源碼分析 小結(jié) 四、axios的使用 特性 基本使用 五、為什么要封裝 六、如何封裝 設(shè)置接口請

    2024年01月24日
    瀏覽(15)
  • 【Java面向?qū)ο蟆慷鄳B(tài)的詳細(xì)介紹,簡單易懂,看這一篇就夠了

    A: 方法或?qū)ο缶哂卸喾N形態(tài),是面向?qū)ο蟮牡谌筇卣?,多態(tài)是建立在封裝和繼承的基礎(chǔ)之上的。簡單來說,多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征。 消除類型之間的耦合關(guān)系 可替代性 可擴(kuò)充性 接口性 靈活性 簡化性 重載式多態(tài)在編譯時(shí)已經(jīng)確定好了。方法名相同而參數(shù)

    2024年01月20日
    瀏覽(43)
  • 【Linux】shell編程基礎(chǔ)(超詳細(xì),入門看這一篇就夠了)

    【Linux】shell編程基礎(chǔ)(超詳細(xì),入門看這一篇就夠了)

    ????【Liunx學(xué)習(xí)記錄篇】???? 篇一:【Linux】VMware安裝unbuntu18.04虛擬機(jī)-超詳細(xì)步驟(附鏡像文件) 篇二:【Linux】ubuntu18.04系統(tǒng)基礎(chǔ)配置及操作 篇三:【Linux】用戶與組的操作詳細(xì)介紹 篇四:【Linux】管理Linux文件權(quán)限屬性介紹 篇五:【Linux】使用數(shù)字表示法和文件表示法修

    2024年02月04日
    瀏覽(41)
  • Numpy入門看這一篇就夠了【史上入門最簡單,開袋即食】

    Numpy入門看這一篇就夠了【史上入門最簡單,開袋即食】

    一邊學(xué)習(xí)一邊分享,好記性不如爛筆頭 目錄 一邊學(xué)習(xí)一邊分享,好記性不如爛筆頭 NumPy問題思考: numpy是什么? 為什么要學(xué)習(xí)numpy? numpy是怎么組成的?特點(diǎn)是什么? numpy的應(yīng)用場景有哪些? NumPy介紹: Tensor概念: 1、ndarray數(shù)組 1.1、為什么引入ndarray數(shù)組 1.2、創(chuàng)建ndarray數(shù)組

    2024年02月09日
    瀏覽(21)
  • 【Golang入門教程】Goland常用快捷鍵,看這一篇就夠了

    【Golang入門教程】Goland常用快捷鍵,看這一篇就夠了

    強(qiáng)烈推薦 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站: 人工智能 前言 在進(jìn)行Go語言開發(fā)時(shí),熟練使用快捷鍵是提高效率、加快編碼速度的關(guān)鍵。 Goland作為一款強(qiáng)大的集成開發(fā)環(huán)境(IDE),提供了豐富的快捷鍵

    2024年02月20日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包