【深度學習入門篇 ⑤ 】PyTorch網絡模型創建

【🍊易編橙:一個幫助編程小伙伴少走彎路的終身成長社群🍊】

大家好,我是小森( ﹡?o?﹡ ) ! 易編橙·終身成長社群創始團隊嘉賓,橙似錦計劃領銜成員、阿里云專家博主、騰訊云內容共創官、CSDN人工智能領域優質創作者 。?


今天我們學習PyTorch的網絡模型創建,全面概括該怎么創建模型!

神經網絡的創建步驟

  1. 定義模型類,需要繼承nn.Module
  2. 定義各種層,包括卷積層、池化層、全連接層、激活函數等等
  3. 編寫前向傳播,規定信號是如何傳輸的

可以用?torchsummary?查看網絡結構,如果沒有的話,使用pip命令進行安裝?

pip install torchsummary

?Module: 神經網絡的模板

所有的神經網絡模塊都應該繼承該模塊

import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):def _init__( self):super()._init_()self.conv1 = nn.Conv2d(1,20,5)self.conv2 = nn.Conv2d( 20,20,5)def forward( self, x):x = F.relu( self.conv1(x))return F.relu(self.conv2(x) )

神經網絡中常見的各種層

常見的層包括:卷積層,池化層,全連接層,正則化層,激活層

導入層有兩種方法:

一種是將其看作一個類,在torch.nn里面

另一種是將其看作一個函數,在torch.nn.functional里面可以調用

全連接層?

全連接層又稱為線性層,所以函數名叫?Linear,執行的操作是𝑦=𝑥𝐴𝑇+𝑏

torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
  • in_feature代表輸入數
  • out_features代表輸出數,即神經元數量
import torch
import torch.nn as nn
m = nn.Linear(2,3)
input = torch.randn(5,2)
output = m( input)
print(output.size() )

輸出:

torch.Size([5, 3])

先搭建個只有一層的網絡,用?torchsummry?查看網絡結構

import torch  
import torch.nn as nn  
from torchsummary import summary  class NeuralNetwork(nn.Module):  def __init__(self):  super().__init__()  self.fc = nn.Linear(10, 1, bias=False) def forward(self, x):  x = self.fc(x)  return x  if __name__ == '__main__':  network = NeuralNetwork()  summary(network, (10,))  # 這里調用 torchsummary 來打印網絡結構

?輸出:

----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Linear-1                    [-1, 1]              10
================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------Process finished with exit code 0

我們再自定義輸入到網絡中:

if __name__ == '__main__':network = NeuralNetwork()network.to('cuda')input = torch.randn(10)input = input.to('cuda')print('input=', input)output = network(input)print('output=', output)result = output.detach().cpu().numpy()print('result=', result)
  • ?detach()用于從計算圖中分離出一個張量(Tensor),使其成為一個新的張量,這個新張量不再需要計算梯度(即不會參與反向傳播)

打印結果:

input= tensor([ 0.5767, -1.2199,  0.4407,  0.6083, -0.1758,  0.2291, -0.8924,  1.1664,0.3445,  0.7242], device='cuda:0')
output= tensor([-0.0183], device='cuda:0', grad_fn=<SqueezeBackward4>)
result= [-0.01834533]

激活函數

常見的激活函數包括?sigmoidrelu,以及softmax,學會他們怎么用,就會用其他激活函數了

Sigmoid

sigmoid是早期的激活函數

?函數的示意圖:

m = nn.Sigmoid()
input = torch.randn(5)
output = m(input)print(input)
print(output)
# 輸出tensor([ 0.6759, -0.8753, -0.3187,  0.0088,  2.0625])
tensor([0.6628, 0.2942, 0.4210, 0.5022, 0.8872])
ReLU

ReLU激活函數常放在全連接層、以及卷積層后面

m = nn.ReLU()    # 或m = F.ReLU()
input = torch.randn(5)
output = m(input)print(input)
print(output)# 輸出
tensor([-2.8164,  0.8885, -0.9526,  0.3723, -0.2637])
tensor([0.0000, 0.8885, 0.0000, 0.3723, 0.0000])
Softmax

softmax是在分類當中經常用到的激活函數,用來放在全連接網絡的最后一層

?

m = nn.Softmax(dim=1)
input = torch.randn(4,3)
output = m(input)print(input)
print(output)# 輸出
tensor([[ 0.1096,  0.7095,  0.5996],[-0.6431, -0.0555,  0.5332],[-0.2367, -0.1851,  0.4029],[-1.0242,  1.9747,  2.0828]])
tensor([[0.2245, 0.4090, 0.3665],[0.1655, 0.2979, 0.5366],[0.2532, 0.2667, 0.4801],[0.0230, 0.4621, 0.5149]])

隨機失活Dropout

當?FC層過多,容易對其中某條路徑產生依賴,從而使得某些參數未能訓練起來

為了防止上述問題,在?FC層之間通常還會加入隨機失活功能,也就是Dropout

dropout的作用是隨機失活的,通常加載FC層之間

m = nn.Dropout(p=0.5)
input = torch.randn(6,6)
output = m(input)print(input)
print(output)

輸出:

tensor([[-2.1174,  0.1180, -1.2979,  0.3600, -1.0417, -1.3583],[-0.2945,  1.0038, -0.9205,  2.5044, -1.2789,  0.4402],[-0.4641,  1.3378,  0.1766,  0.1972,  1.6867, -1.7123],[-1.1137,  1.1291, -0.1404,  0.6881,  0.3442,  0.7479],[ 2.4966, -2.5837,  2.0277, -1.0195,  0.2140, -0.1453],[-0.9259,  1.2443, -0.2939,  0.0304, -0.1057, -0.7959]])
tensor([[-4.2347,  0.0000, -0.0000,  0.0000, -0.0000, -2.7165],[-0.5890,  2.0076, -0.0000,  0.0000, -2.5579,  0.0000],[-0.0000,  0.0000,  0.3533,  0.3945,  3.3733, -3.4246],[-0.0000,  2.2581, -0.0000,  1.3763,  0.0000,  0.0000],[ 0.0000, -0.0000,  4.0554, -0.0000,  0.0000, -0.0000],[-0.0000,  2.4887, -0.5878,  0.0608, -0.0000, -0.0000]])

至此,一個全連接網絡就可以構建了。

案例1:全連接網絡處理一維信息

搭建以下的網絡結構

組合全連接層,dropout層,激活函數,我們就可以構建出一個完整的全連接網絡結構,代碼如下

import torch
import torch.nn as nn
from torchsummary import summaryclass NeuralNetwork(nn.Module):def __init__(self):super().__init__()self.relu = nn.ReLU()self.softmax = nn.Softmax(dim=1)self.dropout = nn.Dropout(p=0.5)self.fc_1 = nn.Linear(1000, 100)self.fc_2 = nn.Linear(100, 50)self.fc_3 = nn.Linear(50, 10)def forward(self,x):x = x.view(-1, 1000)  # 將輸入的維度變成1000x = self.dropout(self.relu(self.fc_1(x)))x = self.dropout(self.relu(self.fc_2(x)))x = self.softmax(self.fc_3(x))return xif __name__ == '__main__':network = NeuralNetwork()network.to('cuda')input = torch.randn(10, 1000)input = input.to('cuda')output = network(input)result = output.detach().cpu().numpy()print('result=', result)summary(network, (1000,))

輸出:

result= [[0.08132502 0.0739548  0.09398187 0.10661174 0.12098686 0.115986820.09127808 0.11483455 0.10602687 0.0950134 ][0.09192658 0.08138597 0.07189317 0.12415235 0.11198585 0.116253770.11482875 0.09960157 0.11294526 0.07502676][0.09182167 0.05779037 0.14180492 0.09080649 0.11460604 0.096480750.10017563 0.08380282 0.10664819 0.11606318][0.07540213 0.09515596 0.11200604 0.11029708 0.14663948 0.087270780.06854413 0.07956128 0.10746382 0.1176593 ][0.07536343 0.091349   0.1040979  0.08714981 0.11877389 0.144979750.08420233 0.08688229 0.11904272 0.08815894][0.08312867 0.05986795 0.12148032 0.10792468 0.10400964 0.12383830.11305461 0.08796311 0.11383145 0.08490121][0.07948367 0.09183787 0.08272586 0.11967309 0.12150185 0.108538620.09249827 0.10322765 0.102726   0.09778718][0.09022301 0.09465341 0.08689808 0.08957365 0.14267558 0.10252120.08516254 0.08472932 0.12696771 0.09659547][0.08116906 0.12094414 0.09831021 0.12145476 0.12512349 0.109310410.09090355 0.08238174 0.07898384 0.0914188 ][0.10484971 0.08653011 0.09862521 0.1086348  0.09272213 0.09912340.08527588 0.10124511 0.10974825 0.11324544]]
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Linear-1                  [-1, 100]         100,100ReLU-2                  [-1, 100]               0Dropout-3                  [-1, 100]               0Linear-4                   [-1, 50]           5,050ReLU-5                   [-1, 50]               0Dropout-6                   [-1, 50]               0Linear-7                   [-1, 10]             510Softmax-8                   [-1, 10]               0
================================================================
Total params: 105,660
Trainable params: 105,660
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.40
Estimated Total Size (MB): 0.41
----------------------------------------------------------------

案例2:全連接網絡處理二維圖像

搭建以下的網絡結構

使用全連接網絡處理二維圖像信息,當二維特征(Feature Map)轉為一維特征時,需要從高維壓縮成一維

這時候可以用?tensor.view(),或者用nn.Flatten(start_dim=1)

import torch
import torch.nn as nn
from torchsummary import summaryclass NeuralNetwork(nn.Module):def __init__(self):super().__init__()self.relu = nn.ReLU()self.softmax = nn.Softmax(dim=1)self.dropout = nn.Dropout(p=0.5)self.fc_1 = nn.Linear(3*256*256, 100)self.fc_2 = nn.Linear(100, 10)self.fc_3 = nn.Linear(10,5)def forward(self,x):x = x.view(-1, 3*256*256)x = self.dropout(self.relu(self.fc_1(x)))x = self.dropout(self.relu(self.fc_2(x)))x = self.softmax(self.fc_3(x))return xif __name__ == '__main__':network = NeuralNetwork()network.to('cuda')input = torch.randn((4,3,256,256))   # 4個樣本,每個樣本3通道,256*256像素input = input.to('cuda')output = network(input)result = output.detach().cpu().numpy()print('result=', result)summary(network, (3, 256, 256))

輸出:

result= [[0.17621297 0.14625552 0.19215888 0.2527377  0.23263492][0.16786984 0.16124012 0.1907313  0.2352923  0.24486642][0.17400946 0.16431957 0.18192714 0.23585317 0.2438907 ][0.1535219  0.18567167 0.18704179 0.16786435 0.30590025]]
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Linear-1                  [-1, 100]      19,660,900ReLU-2                  [-1, 100]               0Dropout-3                  [-1, 100]               0Linear-4                   [-1, 10]           1,010ReLU-5                   [-1, 10]               0Dropout-6                   [-1, 10]               0Linear-7                    [-1, 5]              55Softmax-8                    [-1, 5]               0
================================================================
Total params: 19,661,965
Trainable params: 19,661,965
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.75
Forward/backward pass size (MB): 0.00
Params size (MB): 75.00
Estimated Total Size (MB): 75.76
----------------------------------------------------------------

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

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

相關文章

git、huggingface 學術加速

1、git 有時候服務器不能直接訪問 github&#xff0c;下載代碼會很麻煩&#xff1b;安裝庫的時候&#xff0c;pip xx git 就更難了 比如&#xff0c;這次我需要安裝 unsloth&#xff0c;官方給出的腳本是&#xff1a; pip install “unsloth[cu121-torch220] githttps://git…

【python】函數重構

函數重構 函數重構pycharm函數重構步驟函數重構練習 函數重構 函數重構是指對現有函數進行修改和優化的過程。重構的目的是改善代碼的可讀性、可維護性和靈活性&#xff0c;同時保持其功能不變。函數重構通常包括以下步驟&#xff1a; 理解函數的功能和目的。了解函數的作用和…

OSPF.綜合實驗

1、首先將各個網段基于172.16.0.0 16 進行劃分 1.1、劃分為4個大區域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四個網段 劃分R4 劃分area2 劃分area3 劃分area1 2、進行IP配置 如圖使用配置指令進行配置 ip address x.x.x.x /x 并且將缺省路由…

Sortable.js板塊拖拽示例

圖例 代碼在圖片后面 點贊??關注&#x1f64f;收藏?? 頁面加載后顯示 拖拽效果 源代碼 由于js庫使用外鏈&#xff0c;所以會加載一會兒 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

【Go系列】 Go的錯誤處理

承上啟下 上一篇文章中介紹了struct和interface&#xff0c;在Go語言中&#xff0c;是沒有Class這個概念的&#xff0c;我們可以通過Struct和方法的組合&#xff0c;來實現Class。我們通過Struct嵌套來實現繼承這樣的一種機制&#xff0c;并且不用設置虛函數這樣的特殊說明。同…

如何防止第三方DLL注入自己的進程?

PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY 結構 struct _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY {union {DWORD Flags;struct {DWORD MicrosoftSignedOnly : 1;DWORD StoreSignedOnly : 1;DWORD MitigationOptIn : 1;DWORD AuditMicrosoftSignedOnly : 1;DWORD Audit…

C語言 ——— 實用調試技巧(Visual Studio)

目錄 Debug 和 Release 的區別 F10 --- 逐過程調試 & F11 --- 逐語句調試 F9 --- 新建/切換斷點 & F5 --- 開始調試 shift F5 & ctrl F5 Debug 和 Release 的區別 Debug&#xff1a;通常為調試版本&#xff0c;它包含調試信息&#xff0c;并且不作任何優化…

一 GD32 MCU 開發環境搭建

GD32 系列為通用型 MCU &#xff0c;所以開發環境也可以使用通用型的 IDE &#xff0c;目前使用較多的是 KEIL、 IAR 、 GCC 和 Embedded Builder &#xff0c;客戶可以根據個人喜好來選擇相應的開發環境。 目錄 1、使用 Keil 開發 GD32 目前市面通用的MDK for ARM版本有Kei…

華為OD機試真題2024版-路口最短時間問題

題目描述 假定街道是棋盤型的&#xff0c;每格距離相等&#xff0c;車輛通過每格街道需要時間均為 timePerRoad&#xff1b; 街道的街口&#xff08;交叉點&#xff09;有交通燈&#xff0c;燈的周期 T(lights[row][col]) 各不相同&#xff1b; 車輛可直行、左轉和右轉&…

企業網三層架構

企業網三層架構&#xff1a;是一種層次化模型設計&#xff0c;旨在將復雜的網絡設計分成三個層次&#xff0c;每個層次都著重于某些特定的功能&#xff0c;以提高效率和穩定性。 企業網三層架構層次&#xff1a; 接入層&#xff1a;使終端設備接入到網絡中來&#xff0c;提供…

Python爬蟲教程第二篇:進階技巧與實戰案例

Python爬蟲教程第二篇&#xff1a;進階技巧與實戰案例 在上一篇教程中&#xff0c;我們學習了Python爬蟲的基礎概念、基本流程以及一個簡單的入門實踐案例。本篇教程將帶領大家進一步探索Python爬蟲的進階技巧&#xff0c;并提供一個實戰案例&#xff0c;幫助大家提升爬蟲技能…

Android12 MultiMedia框架之GenericSource extractor

前面兩節學習到了各種Source的創建和extractor service的啟動&#xff0c;本節將以本地播放為例記錄下GenericSource是如何創建一個extractor的。extractor是在PrepareAsync()方法中被創建出來的&#xff0c;為了不過多贅述&#xff0c;我們直接從GenericSource的onPrepareAsyn…

Mojolicious命令行工具:自動化Web開發的瑞士軍刀

Mojolicious是一個高性能的、基于Perl的Web開發框架&#xff0c;它提供了一整套工具來簡化Web開發流程。其中&#xff0c;Mojolicious的命令行工具集是其強大功能的一部分&#xff0c;允許開發者快速生成項目模板、運行開發服務器、執行各種開發任務等。本文將詳細介紹Mojolici…

qt 自定義信號號槽 簡單舉例

在Qt中&#xff0c;自定義信號和槽是一種非常靈活的方式來處理對象之間的通信。以下是一個簡單的例子&#xff0c;展示了如何定義和使用自定義的信號和槽。 首先&#xff0c;我們定義一個名為MyClass的類&#xff0c;該類繼承自QObject&#xff0c;并聲明一個自定義信號和一個…

13_Shell系統函數

13_Shell系統函數和自定義函數 一、系統函數 basename 獲取文件名 #!/bin/bash#basename 相對路徑文件名 basename ./1.sh#basename 絕對路徑文件名 basename /tmp/1.sh#basename 去除文件后綴名 basename /tmp/1.sh .shdirname 獲取文件所在目錄名 #!/bin/bash#dirname 相對路…

Redis持久化RDB,AOF

目 錄 CONFIG動態修改配置 慢查詢 持久化 在上一篇主要對redis的了解入門&#xff0c;安裝&#xff0c;以及基礎配置&#xff0c;多實例的實現&#xff1a;redis的安裝看我上一篇&#xff1a; Redis安裝部署與使用,多實例 redis是擋在MySQL前面的&#xff0c;運行在內存…

Week 6-楊帆-學習總結

- 46 語義分割和數據集 語義分割概念 語義分割是一種計算機視覺任務&#xff0c;其目標是將圖像分割成屬于不同語義類別的區域。與目標檢測不同&#xff0c;語義分割關注的是像素級別的標注和預測&#xff0c;能夠識別并理解圖像中每一個像素的內容。這使得語義分割在理解圖像…

產品經理-研發流程-敏捷開發-迭代-需求評審及產品規劃(15)

敏捷開發是以用戶的需求進化為核心&#xff0c;采用迭代、循序漸進的方法進行軟件開發。 通俗來說&#xff0c;敏捷開發是一個軟件開發流程&#xff0c;是一個采用了迭代方法的開發流程 簡單來說&#xff0c;迭代就是把一個大產品拆分出一些最小的實現單位。完成不同的迭代就最…

機器學習筑基篇,Jupyter Notebook 精簡指南

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 簡明指南 描述&#xff1a;前面我們已經在機器學習工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安裝 Anaconda 工具包&#xff0c;其…

老物件線上3D回憶展拓寬了藝術作品的展示空間和時間-深圳華銳視點

在數字技術的浪潮下&#xff0c;3D線上畫展為藝術家們開啟了一個全新的展示與銷售平臺。這一創新形式不僅拓寬了藝術作品的展示空間&#xff0c;還為廣大觀眾帶來了前所未有的觀賞體驗。 3D線上畫展制作以其獨特的互動性&#xff0c;讓藝術不再是單一的視覺享受。在這里&#x…