Pytorch深度學習實踐筆記10(b站劉二大人)

🎬個人簡介:一個全棧工程師的升級之路!
📋個人專欄:pytorch深度學習
🎀CSDN主頁?發狂的小花
🌄人生秘訣:學習的本質就是極致重復!

《PyTorch深度學習實踐》完結合集_嗶哩嗶哩_bilibili?

?

目錄

1 卷積神經網絡

2 拆解卷積

3 特征提取+分類



1 卷積神經網絡


CNN,用于特征提取,但是計算量大,卷積算子是一個計算密集型算子,工業界優化卷積算子是一個重大的任務。有LeNet、AlexNet、VGG系列、ResNet、很多深度學習框架都提供了豐富的CNN模型實現個訓練的接口。

  • ResNet深度殘差網絡:

Resnet50(深度殘差網絡),圖像分類網絡,2015年何凱明提出。殘差是在正常的神經網絡中加了一個short cut 分支結構,也稱為高速公路。這樣網絡就不是單純卷積的輸出F(x),而是卷積的輸出和前面輸入的疊加F(x)+X,可以很好的解決訓練過程中的梯度消失問題。被證明具有很強的圖像特征提取能力,一般作為一種特征提取器來使用。常用來作為back bone,即骨干網絡。也被用來測試AI芯片的性能指標。

  • 為什么重要?

(1)常被用來做back bone,例如 YoLo-v3 ,被用來作為特征提取器,特斯拉的占用網絡
(2)性能標桿

  • ResNet包含的算法:

(1)卷積算法
卷積是CNN網絡的核心,對圖片或者特征圖進行進一步的特征提取,從而實現在不同尺度下的特征提取或者特征融合。
(2)激活(relu)
卷積是乘加運算,屬于線性運算,使用激活函數是為了引入非線性因素,提高泛化能力,將一部分神經元激活,而將另一部分神經元關閉。
(3)池化
池化層主要是為了降維,減少運算量,同時可以保證輸出特征圖中的關鍵特征
(4)加法
殘差結構,解決梯度消失問題
(5)全連接
全連接層,稱為Linear層或者FC層,將所有學習到的特征進一步融合,并映射到樣本空間的特征上,輸出與樣本對應。全連接層之后會加一個Softmax,完成多分類。


2 拆解卷積

  • 卷積為什么重要

(1)通過卷積核局部感知圖像,感受野(有點像人眼盯著某一個地方看)
(2)滑動以獲取全局特征(有點像人眼左看右看物體)
(3)權重矩陣(記憶)

  • 特征圖(Feature Map)

卷積操作從輸入圖像提取的特征圖,即卷積算法的輸出結果,包含了輸入圖像的抽象特征。

  • 感受野

卷積核在輸入圖像上的滑動掃描過程,表示一個輸出像素“看到”的輸入圖像中區域的大小,注意是從輸出來看。如果將卷積比作窗戶,那么感受野就是一個輸出像素透過這個窗戶可以看到的輸入圖片的范圍。
感受野影響神經網絡對于圖像的理解和圖像特征的提取。大的感受野可以使得神經網絡理解圖像的全局信息,從而提取全局特征。小的感受野只能捕捉圖像的局部特征。

  • 2個3x3卷積替代5x5卷積的意義?

首先可以替代是因為從輸出元素看,2個3x3卷積和1個5x5卷積,具有相同的感受野。
優勢:
(1)2個3x3卷積的卷積核參數量為3x3+3x3=18,而1個5x5=25
(2)一個卷積變成兩個卷積,加深了神經網絡的層數,從而在卷積后面引入更多的非線性層,增加了非線性能力。

  • 卷積公式

輸出通道就是卷積核的個數

  • Padding參數

指的是在輸入圖像的周圍添加的額外的像素值,用來擴大輸入圖像的尺寸,這些額外填充的像素值通常設置為0,卷積在這個填充后的圖像上進行。
Padding主要是為了防止邊緣信息的損失,保持輸出大小與輸入大小一致。
需要填充的場景:
(1)相同卷積(輸入和輸出尺寸一致)
(2)處理小物體,邊緣像素卷積運算較少,多次卷積容易丟失在邊緣的小物體,Padding可以提高
(3)網絡設計靈活

  • Stride 參數

卷積核在活動過程中每次跳過的像素的數量,可以減少計算量、控制Feature Map輸出的大小,一定程度上防止過擬合,這是通過降低模型的復雜度來實現的。
Dilation 參數和空洞卷積
dilation指的是卷積核元素之間的間距,決定卷積核在輸入數據上的覆蓋范圍。增大dilation,增大感受野,由此引入了空洞卷積。
空洞卷積擴大了卷積核的感受野,但卻不增加卷積核的尺寸,減少運算量;可以解決大尺寸輸入圖像的問題;可以處理遙遠像素之間的關系。

  • 卷積長、寬推導


除了以上的三個tensor,還有計算卷積的三個參數,Padding、stride、dilation,這樣才構成一個完整的卷積運算。
無參數推導:


加padding推導:


加上stride推導:


加上dilation推導:


3 特征提取+分類

?


輸入->卷積->輸出




一個簡單的神經網絡:


一些代碼說明:
代碼說明:


1、torch.nn.Conv2d(1,10,kernel_size=3,stride=2,bias=False)
1是指輸入的Channel,灰色圖像是1維的;10是指輸出的Channel,也可以說第一個卷積層需要10個卷積核;kernel_size=3,卷積核大小是3x3;stride=2進行卷積運算時的步長,默認為1;bias=False卷積運算是否需要偏置bias,默認為False。padding = 0,卷積操作是否補0。
2、self.fc = torch.nn.Linear(320, 10),這個320獲取的方式,可以通過x = x.view(batch_size, -1) # print(x.shape)可得到(64,320),64指的是batch,320就是指要進行全連接操作時,輸入的特征維度。


CPU代碼:

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim# prepare datasetbatch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)# design model using classclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)self.pooling = torch.nn.MaxPool2d(2)self.fc = torch.nn.Linear(320, 10)def forward(self, x):# flatten data from (n,1,28,28) to (n, 784)batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x = F.relu(self.pooling(self.conv2(x)))x = x.view(batch_size, -1) # -1 此處自動算出的是320x = self.fc(x)return xmodel = Net()# construct loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)# training cycle forward, backward, updatedef train(epoch):running_loss = 0.0for batch_idx, data in enumerate(train_loader, 0):inputs, target = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, target)loss.backward()optimizer.step()running_loss += loss.item()if batch_idx % 300 == 299:print('[%d, %5d] loss: %.3f' % (epoch+1, batch_idx+1, running_loss/300))running_loss = 0.0def test():correct = 0total = 0with torch.no_grad():for data in test_loader:images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs.data, dim=1)total += labels.size(0)correct += (predicted == labels).sum().item()print('accuracy on test set: %d %% ' % (100*correct/total))if __name__ == '__main__':for epoch in range(10):train(epoch)test()



GPU代碼:

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt# prepare datasetbatch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])train_dataset = datasets.MNIST(root='./dataset/mnist/', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
test_dataset = datasets.MNIST(root='./dataset/mnist/', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)# design model using classclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)self.pooling = torch.nn.MaxPool2d(2)self.fc = torch.nn.Linear(320, 10)def forward(self, x):# flatten data from (n,1,28,28) to (n, 784)batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x = F.relu(self.pooling(self.conv2(x)))x = x.view(batch_size, -1) # -1 此處自動算出的是320# print("x.shape",x.shape)x = self.fc(x)return xmodel = Net()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)# construct loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)# training cycle forward, backward, updatedef train(epoch):running_loss = 0.0for batch_idx, data in enumerate(train_loader, 0):inputs, target = datainputs, target = inputs.to(device), target.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, target)loss.backward()optimizer.step()running_loss += loss.item()if batch_idx % 300 == 299:print('[%d, %5d] loss: %.3f' % (epoch+1, batch_idx+1, running_loss/300))running_loss = 0.0def test():correct = 0total = 0with torch.no_grad():for data in test_loader:images, labels = dataimages, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, dim=1)total += labels.size(0)correct += (predicted == labels).sum().item()print('accuracy on test set: %d %% ' % (100*correct/total))return correct/totalif __name__ == '__main__':epoch_list = []acc_list = []for epoch in range(10):train(epoch)acc = test()epoch_list.append(epoch)acc_list.append(acc)plt.plot(epoch_list,acc_list)plt.ylabel('accuracy')plt.xlabel('epoch')# plt.show()plt.savefig('./data/pytorch9.png')

🌈我的分享也就到此結束啦🌈
如果我的分享也能對你有幫助,那就太好了!
若有不足,還請大家多多指正,我們一起學習交流!
📢未來的富豪們:點贊👍→收藏?→關注🔍,如果能評論下就太驚喜了!
感謝大家的觀看和支持!最后,?祝愿大家每天有錢賺!!!歡迎關注、關注!

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

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

相關文章

C++的第一道門坎:類與對象(一)

1.面向過程與面向對象 1.1面向過程 我們之前學習的C語言就是一種面向過程的語言,面向過程的語言強調的是具體實現的過程,一般用函數來具體實現。我們用面向過程的思想,就可以把炒菜分為以下幾個步驟: 1.2面向對象 而對于面向對象的語言而言…

【簡單介紹下容器是什么?】

🎥博主:程序員不想YY啊 💫CSDN優質創作者,CSDN實力新星,CSDN博客專家 🤗點贊🎈收藏?再看💫養成習慣 ?希望本文對您有所裨益,如有不足之處,歡迎在評論區提出…

【Spring】Spring AOP底層原理:JDK動態代理和CGLIB動態代理

目錄 1、代理模式 1.1、靜態代理 1.2、動態代理 2、JDK 動態代理 2.1、jdk動態代理簡介 2.2、使用JDK動態代理機制步驟 3、CGLIB 動態代理 3.1、CGLIB 動態代理的特性 3.2、CGLIB的核心類 3.3、CGLIB 動態代理步驟 4、JDK 和 CGLIB 創建代理對象的區別 ?編輯 1、…

通關!游戲設計之道Day16

皆大歡喜計費點 游戲行業中有一項設計顯得越來越重要,那就是計費點設計 是開發者琢磨出來的一系列手段,讓玩家買了游戲之后,還能繼續付費 對于把玩家跟他們的錢拆散,游戲開發者們總是樂此不疲 來看幾個能讓開發者額外多賺些錢…

(四)手把手教你內網穿透,實現外網主機訪問內網服務器

背景:書接上回, 服務器的使用-CSDN博客 課題組成員都有自己的賬號,且能通過內網訪問服務器,進行遠程連接了。我們知道內網中的主機可以訪問公網的主機,反之不可以訪問。那么如果課題組成員在家不在內網區域內&#x…

源碼編譯安裝LAMP與部署

目錄 一、LAMP架構的簡述 1.LAMP搭建時各組件安裝順序 二、編譯安裝Apache httpd服務 1.關閉防火墻,將安裝Apache所需軟件包傳到/opt目錄下 2.安裝環境依賴包?編輯 3.配置軟件模塊 4.編譯及安裝 5.優化配置文件路徑,并把httpd服務的可執行程序文…

基于51單片機的智能燈光控制系統

一.硬件方案 智能燈光控制系統由單片機最小系統、人體感應模塊、關照強度模塊、燈光控制模塊、電源模塊和燈泡組成。本文以STC89C52單片機為核心,通過利用光照度和紅外人體感應相結合主動與被動的探測方法,現了室內無人或者關照充足時燈光自動光燈&…

Kubernetes 容器資源管理Resources和探針Probe

資源配額 Resources 在 Kubernetes 中,resources 配置用于設置容器的資源請求和限制,以確保集群中的資源(如 CPU 和內存)得到合理分配和使用。 在之前的pod中,不寫 resources 字段。就意味著 Pod 對運行的資源要求“…

Java面試八股之AQS對資源的共享方式

AQS對資源的共享方式 AQS設計了一套靈活的機制,不僅支持獨占(Exclusive)鎖模式,也支持共享(Shared)鎖模式,使得資源可以被一個或者多個線程以不同的方式訪問。這兩種模式通過控制一個內部的vol…

技術速遞|宣布 Java on Azure 開發工具支持 Azure Functions Flex Consumption

作者:Jialuo Gan 排版:Alan Wang Azure Functions Flex Consumption 剛剛在微軟 Build 2024大會期間發布(詳情請參見本博客)。我們很高興地與大家分享,Azure Functions 的 IntelliJ Azure Toolkit 和 Maven 插件現在也…

pyqt QTableView表格控件

pyqt QTableView表格控件 QTableView效果代碼 QTableView QTableView 是 PyQt中的一個控件,用于顯示表格數據。它通常與 QAbstractItemModel 或其子類(如 QStandardItemModel)一起使用,以提供和管理表格中的數據。 效果 代碼 i…

wordpress主題 ACG美化插件v3.4.2支持zibll主題7b2主題美化

獨具一格的二次元風格,打造全新的子比美化方向 大部分代碼均為CSS、JS做成插件只是為了方便懶人小白站長 后臺全功能一覽,大部分美化均為網上通用流傳,

2.冒泡排序

樣例輸入 5 8 3 6 4 9 樣例輸出 3 4 6 8 9 以下是解題答案&#xff1a; class demo1{public static void main(String[] args) {Scanner scnnew Scanner(System.in);int[] array new int[scn.nextInt()];if(array.length>0&&array.length<200){for(int…

python列表訪問的深入解析

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、正向索引與負索引的奧秘 二、切片&#xff1a;高效訪問多個元素 切片示例 三、切片的…

MIT6.828 Lab2-3 Sysinfo

目錄 一、實驗內容二、實驗過程2.1 已有的代碼2.2 需補充內容/kernel/kalloc.c修改&#xff08;剩余內存計算的函數&#xff09;/kernel/proc.c修改&#xff08;統計進程數量的函數&#xff09;/kernel/defs.h修改添加/kernel/sysinfo.c文件/kernel/syscall.h修改/kernel/sysca…

Java 文件操作和輸入輸出流

在 Java 編程中&#xff0c;文件操作和輸入輸出流是非常常見和重要的任務&#xff0c;它們允許你讀取和寫入文件、處理數據流等。 文件操作概述 文件操作是指對文件進行創建、讀取、寫入、刪除等操作的過程。在 Java 中&#xff0c;文件操作通常涉及到使用文件對象、輸入輸出…

OpenBayes 一周速覽|TripoSR 開源:1 秒即 2D 變 3D、經典 GTZAN 音樂數據集上線

公共資源速遞 This Weekly Snapshots &#xff01;5 個數據集&#xff1a; FER2013 面部表情識別數據集 GTZAN 音樂流派分類數據集 MVTec-AD 工業異常檢測數據集 UCAS-AOD 遙感目標檢測數據集 Oxford 102 Flowers 花卉圖片數據集 3 個教程&#xff1a; Latte 全球首個開…

利用ArcGIS Python批量拼接遙感影像(arcpy batch processing)

本篇文章將說明如何利用ArcGIS 10.1自帶的Python IDLE進行遙感影像的批量拼接與裁剪。 1.運行環境&#xff1a;ArcGIS10.1 (安裝傳送門)、Python IDLE 2.數據來源&#xff1a;地理空間數據云 GDEMV2 30M分辨率數字高程數據 3.解決問題&#xff1a;制作山西省的DEM影像 如下…

【WEB前端2024】開源智體世界:喬布斯3D紀念館-第30課-門的移動動畫

【WEB前端2024】開源智體世界&#xff1a;喬布斯3D紀念館-第30課-門的移動動畫 使用dtns.network德塔世界&#xff08;開源的智體世界引擎&#xff09;&#xff0c;策劃和設計《喬布斯超大型的開源3D紀念館》的系列教程。dtns.network是一款主要由JavaScript編寫的智體世界引擎…

服務器端口轉發,服務器端口轉發的作用、好處與壞處

服務器端口轉發&#xff0c;服務器端口轉發的作用、好處與壞處。 服務器端口轉發是一種關鍵的網絡技術&#xff0c;它在網絡安全和通信中發揮著不可替代的作用。其主要功能是將來自一個端口的網絡流量轉發到另一個端口&#xff0c;從而實現內外網之間的流量交互。這種技術通常…