【D2】神經網絡初步學習

總結:學習了 PyTorch 中的基本概念和常用功能,張量(Tensor)的操作、自動微分(Autograd)、正向傳播、反向傳播。通過了解認識LeNet 模型,定義神經網絡類,熟悉卷積神經網絡的基本結構和訓練過程,卷積層和全連接層的創建和運用。在訓練網絡中,通過反向傳播計算梯度,利用優化器根據計算出的梯度更新網絡中的參數。--2025/02/12

目錄

1. 實驗環境

1.1. 導入庫

1.2. 版本

2. 基本概念

2.1. Tensor 張量

2.2. Scalar 標量

2.3. Autograd 自動微分

2.3.1. 啟動自動微分

2.3.2. 反向傳播

2.3.3. 梯度累加和清零

3. LeNet 神經網絡

3.1. 基本概念

3.1.1. torch.nn

3.1.2. nn.Module 類

3.1.3. 卷積層 (nn.Conv2d)

3.1.4. 全連接層 (nn.Linear)

3.2. 定義神經網絡類 Net

3.2.1?__init__ 構造函數

3.2.2. forward 向前傳播函數

3.3. 訓練網絡

3.3.1. 可學習參數

3.3.2. 批量處理(Mini-Batch)

3.3.3. 損失函數

3.3.4. 反向傳播

3.3.5. 優化器:SGD

總結


1. 實驗環境

1.1. 導入庫
  • Import numpy as np:?用于處理數組和矩陣運算

    Import torch as t :pytorch的核心庫,構建和訓練深度學習模型

    import torch.optim as optim:pytorch的優化器模塊,根據計算出的梯度更新神經網絡的參數

    import torch.nn as nn:PyTorch 提供的神經網絡模塊,專門用于構建和訓練神經網絡模型

    import torch.nn.functional as F:包含函數操作,如激活函數、損失函數、卷積操作等)

1.2. 版本
  • torch:2.6.0

    Python 3.8.8

    jupyter-notebook : 6.3.0


2. 基本概念

2.1. Tensor 張量

Tensor是PyTorch中重要的數據結構,可認為是一個高維數組。它可以是一個數(標量)、一維數組(向量)、二維數組(矩陣)以及更高維的數組。

  • 標量(0 維):一個數值,例如 3.14。
  • 向量(1 維):一組有序的數值,例如 [1, 2, 3]。
  • 矩陣(2 維):一個二維的數值表格,例如 [[1, 2], [3, 4]]。
  • 高維數組(n 維):更高維的數組,用于存儲更復雜的數據結構,例如圖像數據(通常為 4 維:batch_size, channels, height, width)。
# 初始化一個 5x3 的張量
x = t.Tensor(5, 3)# 賦值為一個 2x2 的初始化矩陣
x = t.Tensor([[1, 2], [3, 4]])# 獲取張量的行數(即第一個維度)
x.size(0)# 獲取張量的列數(即第二個維度)
x.size(1)# 獲取列數的另一種方式
x.size()[1]# 隨機生成一個 5x3 的張量
x = t.rand(5, 3)
y = t.rand(5, 3)# 三種方法來進行兩個矩陣相加:
a = x + y  # 方法 1:直接相加
b = t.add(x, y)  # 方法 2:使用 PyTorch 自帶的加法函數
c = t.Tensor(5, 3)  # 初始化一個空張量
t.add(x, y, out=c)  # 方法 3:將結果存儲到 c 中

Tensor 與 NumPy 的轉換

# 創建一個全為 1 的張量
a = t.ones(5)# 將張量轉換為 NumPy 數組
b = a.numpy()# 創建一個全為 1 的 NumPy 數組
a = np.ones(5)# 將 NumPy 數組轉換為張量
b = t.from_numpy(a)

2.2. Scalar 標量

Scalar(標量)是一個沒有維度的單一數值,它是零維的張量。標量在 PyTorch 中通常表示為一個只有一個元素的 Tensor。

2.2.1. 獲取標量值

(1) 使用 .item() 從包含單一元素的張量中提取該元素的值:

(2) 使用 .tolist() 將標量張量轉換為列表:

# 使用 item() 方法獲取標量值
scalar = b[0]
scalar_value = scalar.item()# 使用 tolist() 方法將標量張量轉換為列表
x = t.Tensor([3.14])  # 創建一個包含單一值的張量
scalar_list = x.tolist()  # 將其轉換為列表
print(scalar_list)  # 輸出: [3.14]

2.3. Autograd 自動微分

深度學習中的訓練過程本質上是通過反向傳播求導數,而 PyTorch 提供的 autograd 模塊自動為張量計算梯度,從而避免了手動計算導數的復雜過程。

2.3.1. 啟動自動微分

在創建張量時,可以通過 requires_grad=True 來啟動自動微分功能,表示該張量需要計算梯度。

x = t.ones(2, 2, requires_grad=True)  # 創建一個可以計算梯度的張量
2.3.2. 反向傳播

反向傳播通過調用 backward() 來計算梯度。以下示例展示了如何計算梯度:


2.3.3. 梯度累加和清零

在每次執行 backward() 之后,PyTorch 會將梯度值累加,因此每次反向傳播之前需要手動清零梯度。

#清零梯度,以下劃線結束的函數是inplace操作,修改自身的值
x.grad.zero_()


3. LeNet 神經網絡

LeNet 是一種經典的卷積神經網絡(CNN)結構,廣泛應用于圖像分類任務。LeNet 模型通常由兩個卷積層、兩個池化層以及三個全連接層組成。

3.1. 基本概念
3.1.1. torch.nn

torch.nn 是 PyTorch 中專門為構建神經網絡設計的模塊,封裝了構建和訓練神經網絡所需的大量工具,包括各種層(如卷積層、全連接層、激活函數等)和常用的操作(如損失函數、優化器等)。

3.1.2. nn.Module

nn.Moduletorch.nn 中最重要的類,所有的神經網絡模型都應該繼承自 nn.Module。我們可以通過繼承 nn.Module 來定義自己的網絡模型。在繼承 nn.Module 時,需要定義以下兩個方法:

  • __init__:用于定義模型的結構,初始化網絡的各個層。
  • forward:定義前向傳播,描述數據如何通過網絡流動。
3.1.3. 卷積層 (nn.Conv2d)

卷積層用于從輸入數據中提取空間特征nn.Conv2d 用于定義二維卷積層。它的常用參數包括:

  • in_channels:輸入數據的通道數(例如,RGB圖像的通道數為3,灰度圖像為1)。
  • out_channels:卷積層輸出的通道數(卷積核的數量)。
  • kernel_size:卷積核的大小,通常是一個整數或元組(height, width)。

# 卷積層 '1'表示輸入通道數為1→灰度圖像, '6'表示輸出通道數→卷積核的數量,'5'表示卷積核為5*5
self.conv1 = nn.Conv2d(1, 6, 5)?
# 卷積層
self.conv2 = nn.Conv2d(6, 16, 5)?

3.1.4. 全連接層 (nn.Linear)

全連接層是神經網絡中非常重要的一部分,主要用于將提取到的特征映射到最終的輸出。nn.Linear 定義了一個全連接層,其常用參數為:

  • in_features:輸入特征的數量。
  • out_features:輸出特征的數量。

? # 仿射層/全連接層,y = Wx + b
? ? ? ? #16*5*5是卷積層輸出的特征圖像展平后的維度,表示每個樣本通過卷積層處理后的大小。
? ? ? ? self.fc1 ? = nn.Linear(16*5*5, 120)?
? ? ? ? #120,84,10全連接層的輸出維度。10表示模型的預測類別數。10類
? ? ? ? self.fc2 ? = nn.Linear(120, 84)
? ? ? ? self.fc3 ? = nn.Linear(84, 10)

3.2. 定義神經網絡類 Net
import torch.nn as nn
import torch.nn.functional as F
#包含常見函數,比如激活函數relu,池化操作maxpool
class Net(nn.Module):#定義神經網絡類Net,繼承于nn.Moduledef __init__(self):#定義構造函數,用來定義網絡各個層super(Net, self).__init__()#調用父類nn.module的構造函數# 卷積層 '1'表示輸入圖片為單通道的灰度圖像, '6'表示輸出通道數,'5'表示卷積核為5*5self.conv1 = nn.Conv2d(1, 6, 5) # 卷積層self.conv2 = nn.Conv2d(6, 16, 5) # 仿射層/全連接層,y = Wx + b#16*5*5是卷積層輸出的特征圖像展平后的維度,表示每個樣本通過卷積層處理后的大小。self.fc1   = nn.Linear(16*5*5, 120) #120,84,10全連接層的輸出維度。10表示模型的預測類別數。10類self.fc2   = nn.Linear(120, 84)self.fc3   = nn.Linear(84, 10)def forward(self, x): #定義向前傳播# 卷積 -> 激活函數(ReLU) -> 池化(MaxPool)x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))#self.conv1(x):通過卷積層conv1,將輸入x進行卷積操作#F.relu():relu激活函數,將輸入的負值變為0,正值不變。#F.max_pool2d(...,(2,2)):最大池化操作,池化窗口大小2*2x = F.max_pool2d(F.relu(self.conv2(x)), 2) # reshape,展平數據,輸入全連接層,‘-1’表示自適應x = x.view(x.size()[0], -1) #展平的數據進入全連接層,relu激活函數增加非線性#最后一層輸出類別的預測值x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)        return x
#創建Net對象,神經網絡
net = Net()
#打印出網絡的結構顯示每一層參數
print(net)
Net((conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(fc1): Linear(in_features=400, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)
)
3.2.1?__init__ 構造函數

__init__ 方法中,我們定義了網絡的各個層(卷積層、池化層、全連接層)。LeNet 網絡一般包含兩個卷積層和三個全連接層。

3.2.2. forward 向前傳播函數

forward 方法中,我們定義了數據如何在網絡中流動,包括卷積、池化、激活函數、展平和全連接層的應用。

3.3. 訓練網絡
3.3.1. 可學習參數
  • 權重(weight):網絡中的參數,決定了輸入和輸出之間的關系,影響每一層的輸出結果。
  • 偏置(bias):每個神經元的額外參數,與權重一起決定神經元的激活值。
3.3.2. 批量處理(Mini-Batch)

批量處理mini-batch:多個樣本組成的小批量.
PyTorch 的神經網絡層(如卷積層)要求輸入的形狀是一個 4D 張量(batch_size, channels, height, width)。
只想輸入一個樣本,input.unsqueeze(0)將batch_size設為1

3.3.3. 損失函數
  • 損失函數:衡量網絡輸出(預測值)與目標值之間的差距

    均方誤差 (MSE, Mean Squared Error):用于回歸問題,計算預測值與真實值之間的平均平方誤差。

    交叉熵損失 (Cross-Entropy Loss):用于分類問題,衡量真實標簽與預測概率分布之間的差異。

3.3.4. 反向傳播

反向傳播包括三個步驟:

  1. 正向傳播:先通過前向傳播計算出模型的輸出和損失。
  2. 計算梯度:然后通過反向傳播計算出每個參數的梯度。梯度的絕對值較大,該參數對損失有很大影響,需要大幅調整
  3. 參數更新:使用這些梯度來調整網絡的參數,使得損失最小化。
#梯度變化
print('反向傳播前conv1.bias偏置的梯度')
print(net.conv1.bias.grad)# 執行一次前向傳播
output = net(input)
target = t.arange(0,10).view(1,10).float()
criterion = nn.MSELoss()# 計算損失
loss = criterion(output, target)# 執行反向傳播(retain_graph=True)用于保留計算圖
loss.backward(retain_graph=True)# 打印反向傳播后的梯度
print('反向傳播后conv1.bias偏置的梯度')
print(net.conv1.bias.grad)# 如果需要繼續進行其他操作,記得清零梯度
net.zero_grad()

梯度的符號(正負)表示了參數調整的方向:

負梯度:表示 如果減小 當前參數的值,損失函數會減少。當前參數的值較大,應該減少它來減小損失。
正梯度:表示 如果增大 當前參數的值,損失函數會減少。意味著當前參數的值較小,應該增加它來減小損失。

3.3.5. 優化器:SGD

主要任務是 根據反向傳播計算出的梯度更新網絡中的參數(如權重和偏置),從而使得損失函數逐步降低,最終達到優化目標。

SGD(隨機梯度下降)優化器
SGD 是最常見的一種優化器,它的基本思路是每次使用一個 mini-batch(小批量)計算梯度,并使用這個梯度更新網絡參數。

import torch.optim as optim
#SGD隨機梯度下降,創建優化器,將需要優化的參數傳入優化器
#指定學習率learning rate
optimizer = optim.SGD(net.parameters(),lr = 0.01)
#先梯度清零
optimizer.zero_grad()
#前向傳播
output = net(input)
#計算損失函數
loss = criterion(output,target)
#反向傳播
loss.backward()
#更新參數
optimizer.step()

總結

  • LeNet 網絡結構:包含卷積層、池化層、全連接層。
  • nn.Moduleforward:通過繼承 nn.Module 和定義 forward 方法來實現網絡結構。
  • 損失函數和優化器:通過損失函數(如交叉熵損失)和優化器(如 SGD)來訓練網絡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek處理自有業務的案例:讓AI給你寫一份小眾編輯器(EverEdit)的語法著色文件

1 DeepSeek處理自有業務的案例:讓AI給你寫一份小眾編輯器(EverEdit)的語法著色文件 1.1 背景 AI能力再強,如果不能在企業的自有業務上產生助益,那基本也是一無是處。將企業的自有業務上傳到線上訓練,那是腦子進水的做法&#xff…

DeepSeek教unity------MessagePack-05

動態反序列化 當調用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 時&#xff0c;二進制數據中存在的任何值都將被轉換為基本值&#xff0c;即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…

C++入門之《拷貝構造函數》詳解

拷貝構造函數是構造函數的一個重載 拷貝構造函數是特殊的構造函數&#xff0c;用于基于已存在對象創建新對象。比如定義一個 Person 類&#xff1a; class Person { private:std::string name;int age; public:Person(const std::string& n, int a) : name(n), age(a…

Ollama命令使用指南

Ollama 命令使用指南 Ollama 命令使用指南1. Ollama 命令概覽2. Ollama 命令詳解2.1 啟動 Ollama2.2 創建模型2.3 查看模型信息2.4 運行模型2.5 停止運行的模型2.6 從注冊表拉取模型2.7 推送模型到注冊表2.8 列出本地模型2.9 查看正在運行的模型2.10 復制模型2.11 刪除模型 3. …

為什么配置Redis時候要序列化配置呢

序列化和反序列化&#xff1f;&#xff1a; 序列化&#xff1a;將對象轉換為二進制數據&#xff0c;以便存儲到Redis中。 反序列化&#xff1a;將Redis中的二進制數據轉換回對象&#xff0c;以便在應用程序中使用。 1. 默認序列化器的問題 如果不配置序列化器&#xff0c;Re…

【問】強學如何支持 遷移學習呢?

案例&#xff1a;從CartPole-v1遷移到MountainCar-v0 在源環境&#xff08;CartPole-v1&#xff09;中訓練模型 首先&#xff0c;我們使用DQN算法在CartPole-v1環境中訓練一個強化學習模型。以下是代碼示例&#xff1a; import gym import torch import torch.nn as nn impor…

深入淺出Java反射:掌握動態編程的藝術

小程一言反射何為反射反射核心類反射的基本使用獲取Class對象創建對象調用方法訪問字段 示例程序應用場景優缺點分析優點缺點 注意 再深入一些反射與泛型反射與注解反射與動態代理反射與類加載器 結語 小程一言 本專欄是對Java知識點的總結。在學習Java的過程中&#xff0c;學習…

【算法與數據結構】并查集詳解+題目

目錄 一&#xff0c;什么是并查集 二&#xff0c;并查集的結構 三&#xff0c;并查集的代碼實現 1&#xff0c;并查集的大致結構和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;優化 小結&#xff1a; 四&#xff0c;并查集的應用場景 省份…

C語言簡單練習題

文章目錄 練習題一、計算n的階乘bool類型 二、計算1!2!3!...10!三、計算數組arr中的元素個數二分法查找 四、動態打印字符Sleep()ms延時函數system("cls")清屏函數 五、模擬用戶登錄strcmp()函數 六、猜數字小游戲產生一個隨機數randsrandRAND_MAX時間戳time() 示例 …

ShenNiusModularity項目源碼學習(8:數據庫操作)

ShenNiusModularity項目使用SqlSugar操作數據庫。在ShenNius.Repository項目中定義了ServiceCollectionExtensions.AddSqlsugarSetup函數注冊SqlSugar服務&#xff0c;并在ShenNius.Admin.API項目的ShenniusAdminApiModule.OnConfigureServices函數中調用&#xff0c;SqlSugar所…

MATLAB圖像處理:圖像特征概念及提取方法HOG、SIFT

圖像特征是計算機視覺中用于描述圖像內容的關鍵信息&#xff0c;其提取質量直接影響后續的目標檢測、分類和匹配等任務性能。本文將系統解析 全局與局部特征的核心概念&#xff0c;深入講解 HOG&#xff08;方向梯度直方圖&#xff09;與SIFT&#xff08;尺度不變特征變換&…

java枚舉類型的查找

AllArgsConstructor Getter public enum FileFilterRangeEnum {FILE_NAME("文件名稱","fileName"),FILE_CONTENT("文件內容","fileContent");private final String text;private final String value;// 根據傳入的字符串值查找對應的枚…

小白win10安裝并配置yt-dlp

需要yt-dlp和ffmpeg 注意存放路徑最好都是全英文 win10安裝并配置yt-dlp 一、下載1.下載yt-dlp2. fffmpeg下載 二、配置環境三、cmd操作四、yt-dlp下視頻操作 一、下載 1.下載yt-dlp yt-dlp地址 找到win的壓縮包點下載&#xff0c;并解壓 2. fffmpeg下載 ffmpeg官方下載 …

【技術解析】MultiPatchFormer:多尺度時間序列預測的全新突破

今天給我大家帶來一篇最新的時間序列預測論文——MultiPatchFormer。這篇論文提出了一種基于Transformer的創新模型&#xff0c;旨在解決時間序列預測中的關鍵挑戰&#xff0c;特別是在處理多尺度時間依賴性和復雜通道間相關性時的難題。MultiPatchFormer通過引入一維卷積技術&…

145,【5】 buuctf web [GWCTF 2019]mypassword

進入靶場 修改了url后才到了注冊頁面 注測后再登錄 查看源碼 都點進去看看 有個反饋頁面 再查看源碼 又有收獲 // 檢查$feedback是否為數組 if (is_array($feedback)) {// 如果是數組&#xff0c;彈出提示框提示反饋不合法echo "<script>alert(反饋不合法);<…

CTF-WEB: 利用iframe標簽利用xss,waf過濾后再轉換漏洞-- N1ctf Junior display

核心邏輯 // 獲取 URL 查詢參數的值 function getQueryParam(param) { // 使用 URLSearchParams 從 URL 查詢字符串中提取參數 const urlParams new URLSearchParams(window.location.search); // 返回查詢參數的值 return urlParams.get(param); } // 使用 DOMPuri…

晶閘管主要參數分析與損耗計算

1. 主要參數 斷態正向可重復峰值電壓 :是晶閘管在不損壞的情況下能夠承受的正向最大阻斷電壓。斷態正向不可重復峰值電壓 :是晶閘管只有一次可以超過的正向最大阻斷電壓,一旦晶閘管超過此值就會損壞,一般情況下 反向可重復峰值電壓 :是指晶閘管在不損壞的情況下能夠承受的…

el-select 設置寬度 沒效果

想實現下面的效果&#xff0c;一行兩個&#xff0c;充滿el-col12 然后設置了 width100%,當時一直沒有效果 解決原因&#xff1a; el-form 添加了 inline 所以刪除inline屬性 即可

Python創建FastApi項目模板

1. 項目結構規范 myproject/ ├── app/ │ ├── core/ # 核心配置 │ │ ├── config.py # 環境配置 │ │ └── security.py # 安全配置 │ ├── routers/ # 路由模塊 │ │ └── users.py # 用戶路由 │ ├…

面試完整回答:SQL 分頁查詢中 limit 500000,10和 limit 10 速度一樣快嗎?

首先&#xff1a;在 SQL 分頁查詢中&#xff0c;LIMIT 500000, 10 和 LIMIT 10 的速度不會一樣快&#xff0c;以下是原因和優化建議&#xff1a; 性能差異的原因 LIMIT 10&#xff1a; 只需要掃描前 10 條記錄&#xff0c;然后返回結果。 性能非常高&#xff0c;因為數據庫只…