PyTorch-卷積神經網絡

卷積神經網絡

基本結構

首先解釋一下什么是卷積,這個卷積當然不是數學上的卷積,這里的卷積其實表示的是一個三維的權重,這么解釋起來可能不太理解,我們先看看卷積網絡的基本結構。

通過上面的圖我們清楚地了解到卷積網絡和一般網絡結構上面的差別,也可以理解為卷積網絡是立體的,而一般的網絡結構是平面的。

卷積層

了解完了基本的結構之后,我們就要了解cnn最重要的一個部分,也是起最為創新的一個部分,卷積層。首先用一張圖片來比較一下卷積網絡到底創新在什么地方。

我們通過這個結構就可以清晰地看到卷積網絡到底是怎么實現的。首先右邊是傳統的網絡結構,在上一篇文章中我們已經詳細的解釋過了。而左邊的圖片,我們首先看看圖中最左邊的結構,你肯定會好奇為什么是32x32x3的一塊立體方塊。這個32×32代表的是像素點,說白了也就是圖片的大小,這個大小是你可以設置的,你可以設置為50×50,也可以是256×256,這都取決與圖片的大小,那么3表示什么呢?3其實表示的是RGB的三個通道,RGB也是什么?RGB表示red,green,blue,這三種顏色的各種組合疊加可以形成各種各樣的顏色,所以任何一張照片都可以用左邊這種圖形來表示。

那么中間這個小方塊又表示什么呢?這個就是我們要重點講的卷積。所謂的卷積,就是這種小方塊,我們設置一個小方塊的大小,但是這個小方塊的厚度必須和左邊的這個大方塊的厚度是一樣的,大方塊每一個像素點由一個0到255的數字表示,這樣我們就可以賦予小方塊權重,比如我們取小方塊的大小是3×3,我們要求起厚度必須要和左邊的大方塊厚度一樣,那么小方塊的的大小就為3x3x3,我們就可以賦予其3x3x3個權重,然后我們就可以開始計算卷積的結果,將小方塊從大方塊的左上角開始,一個卷積小方塊所覆蓋的范圍是3x3x3,然后我們將大方塊中3x3x3的數字和小方塊中的權重分別相乘相加,再加上一個偏差,就可以得到一個卷積的接過,可以抽象的寫成Wx b這種形式,這就是圖上所顯示的接過,然后我們可以設置小方塊的滑動距離,每次滑動就可以形成一個卷積的計算結果,然后講整張大圖片滑動覆蓋之后就可以形成一層卷積的結果,我們看到圖中的卷積結果是很厚的,也就是設置了很多層卷積。總結來說,就是每層卷積就是一個卷積核在圖片上滑動求值,然后設置多個卷積核就可以形成多層的卷積層。

池化層

講完卷積層,接下來就要講一下池化層。為什么會有池化層的出現呢?是因為不斷的做卷積,得到的中間結果會越來越厚,卷積就相當于提取圖片中的特征,所以卷積層一般會設置得越來越厚,不然你就無法從前面的接過來提取更多的特征。這樣就會導致中間的結果會越來越大,計算會越來越慢,所以提出了池化層。

所謂的池化層,就是將圖片的大小縮小的一種處理方式。我們可以先看看下面的圖片。

通過這個圖片,我們可以清楚地看到池化層是怎么處理的。池化層也是需要先設置一個窗口,但是這個小窗口的厚度是1,而不再是前一層輸出的結果的厚度。然后有兩種處理方式,一種是取這個小窗口里面所有元素的最大值來代表這個小窗口,一種是取平均值,然后將小窗口滑動,在第二的位置再做同樣的處理,上層網絡輸出方塊的每一層做完之后就進入這個大方塊的下一層做同樣的操作,這個處理辦法就可以讓整個大方塊的大小變小,可以看看上面的圖片的左邊。右邊是一個簡單的一層厚度,取最大值的例子。

Code

數據集仍然是使用MNIST手寫字體,和之前一樣做同樣的預處理。

Model

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

# 定義 Convolution Network 模型

class Cnn(nn.Module):

????def __init__(self, in_dim, n_class):

????????super(Cnn, self).__init__()

????????self.conv = nn.Sequential(

????????????nn.Conv2d(in_dim, 6, 3, stride=1, padding=1),

????????????nn.ReLU(True),

????????????nn.MaxPool2d(2, 2),

????????????nn.Conv2d(6, 16, 5, stride=1, padding=0),

????????????nn.ReLU(True),

????????????nn.MaxPool2d(2, 2),

????????)

????????self.fc = nn.Sequential(

????????????nn.Linear(400, 120),

????????????nn.Linear(120, 84),

????????????nn.Linear(84, n_class)

????????)

????def forward(self, x):

????????out = self.conv(x)

????????out = out.view(out.size(0), -1)

????????out = self.fc(out)

????????return out

model = Cnn(1, 10)??# 圖片大小是28x28

use_gpu = torch.cuda.is_available()??# 判斷是否有GPU加速

if use_gpu:

????model = model.cuda()

# 定義loss和optimizer

criterion = nn.CrossEntropyLoss()

optimizer = optim.SGD(model.parameters(), lr=learning_rate)

以上就是網絡的模型的部分了。和之前比主要增加了這些不一樣的部分

  • 1?nn.Sequential()
    這個表示將一個有序的模塊寫在一起,也就相當于將神經網絡的層按順序放在一起,這樣可以方便結構顯示
  • 2 nn.Conv2d()
    這個是卷積層,里面常用的參數有四個,in_channels, out_channels, kernel_size, stride, padding
    in_channels表示的是輸入卷積層的圖片厚度

    out_channels表示的是要輸出的厚度

    kernel_size表示的是卷積核的大小,可以用一個數字表示長寬相等的卷積核,比如kernel_size=3,也可以用不同的數字表示長寬不同的卷積核,比如kernel_size=(3, 2)

    stride表示卷積核滑動的步長

    padding表示的是在圖片周圍填充0的多少,padding=0表示不填充,padding=1四周都填充1維

  • 3 nn.ReLU()
    這個表示使用ReLU激活函數,里面有一個參數inplace,默認設置為False,表示新創建一個對象對其修改,也可以設置為True,表示直接對這個對象進行修改
  • 4 nn.MaxPool2d()
    這個是最大池化層,當然也有平均池化層,里面的參數有kernel_size, stride, padding

    kernel_size表示池化的窗口大小,和卷積層里面的kernel_size是一樣的

    stride也和卷積層里面一樣,需要自己設置滑動步長

    padding也和卷積層里面的參數是一樣的,默認是0

    模型需要傳入的參數是輸入的圖片維數以及輸出的種類數

train

訓練的過程是一樣的,只是輸入圖片不再需要展開

這是訓練20個epoch的結果,當然你也可以增加訓練次數,修改里面的參數達到更好的效果,可以參考一下Lenet的網絡結構,自己重新寫一寫

大體上簡單的卷積網絡就是這么構建的,當然現在也有很多復雜的網絡,比如vgg,inceptionv1-v4,resnet以及修正的inception-resnet,這些網絡都是深層的卷積網絡,有興趣的同學可以去看看pytorch的官方代碼實現,或者去github上搜索相應的網絡。

下一節我們將要開始一種特別適合序列數據的新的網絡結構,循環神經網絡。

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

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

相關文章

【Javascript】設計模式之發布訂閱模式

文章目錄 1、現實中的發布-訂閱模式2、DOM 事件3、簡單的發布-訂閱模式4、通用的發布-訂閱模式5、先發布再訂閱6、小結 發布—訂閱模式又叫觀察者模式,它定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于…

Mysql深入學習 基礎篇 Ss.02 詳解四類SQL語句

我親愛的對手,亦敵亦友,但我同樣希望你能成功,與我一起,站在人生的山頂上 ——24.3.1 一、DDL 數據定義語言 1.DDL —— 數據庫操作 查詢 查詢所有數據庫 show databases; 查詢當前數據庫 select database(); 創建 create databa…

【簡說八股】Nginx、GateWay、Ribbon有什么區別?

前言 在現代的微服務架構中,Nginx、Gateway 和 Ribbon 都是處理網絡請求和服務的組件,但它們各自扮演的角色和提供的功能有所不同。下面我將詳細解釋它們之間的區別: Nginx Nginx 是一個高性能的 HTTP 和反向代理服務器,它也可…

Golang Vs Java:為您的下一個項目選擇正確的工具

Java 首次出現在 1995 年,由 James Gosling 和 Sun Microsystems 的其他人開發的一種新編程語言。從那時起,Java 已成為世界上最受歡迎和廣泛使用的編程語言之一。Java 的主要特點包括其面向對象的設計、健壯性、平臺獨立性、自動內存管理以及廣泛的內置…

MSMFN

CDFI是彩色多普勒血流成像 輔助信息 作者未提供數據

Codeforces Round 930 (Div. 2)

substr時間復雜度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;會超時 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

[C++]AVL樹怎么轉

AVL樹是啥 一提到AVL樹&#xff0c;腦子里不是旋了&#xff0c;就是懸了。 AVL樹之所以難&#xff0c;并不是因為結構難以理解&#xff0c;而是因為他的旋轉。 AVL樹定義 平衡因子&#xff1a;對于一顆二叉樹&#xff0c;某節點的左右子樹高度之差&#xff0c;就是該節點的…

5、云原生安全之falco的規則解讀(部分)(上)

文章目錄 1、自定義規則測試1.1、自定義檢測定時任務的規則2、自帶規則詳解部分2.1、意外的出站連接源(類似的還有入站連接)2.2、檢測目錄穿越攻擊2.3、rpm數據庫被修改2.4、數據庫派生新的進程2.5、特權容器啟動2.6、啟動容器掛載到敏感路徑2.7、匹配所有在pod內啟動、并連接…

音視頻數字化(數字與模擬-照相機)

目錄 1、模擬/數字 2、第一臺照相機 3、照相機原理 4、取景方式 5、底片 6、數碼相機 7、數碼相機指標 8、數碼相機分類 (1)單反相機 (2)單電相機 (3)無反相機

2024.03.02藍橋云課筆記

1.scanf與printf取消分隔符的限制方法 示例代碼&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 運行&#xff1a; 輸入&#xff1a;Hello World 輸出&#xff1a;Hello World 注&#xff1a;其中[]中是一個正則…

(UE4升級UE5)Selected Level Actor節點升級到UE5

本問所用工具為&#xff1a;AssetDeveTool虛幻開發常用工具https://gf.bilibili.com/item/detail/1104960041 在UE4中 編輯器藍圖有個節點為 Get Selected Level Actors 但在UE5中&#xff0c;藍圖直接升級后&#xff0c;節點失效&#xff0c;如圖&#xff1a; 因為在UE5中&am…

Vue3中Vuex狀態管理庫學習筆記

1.什么是狀態管理 在開發中&#xff0c;我們會的應用程序需要處理各種各樣的數據&#xff0c;這些數據需要保存在我們應用程序的某個位置&#xff0c;對于這些數據的管理我們就稱之為狀態管理。 在之前我們如何管理自己的狀態呢&#xff1f; 在Vue開發中&#xff0c;我們使用…

大廠面試經驗:如何對加密后的數據進行模糊查詢操作

加密后的數據對模糊查詢不是很友好&#xff0c;本篇就針對加密數據模糊查詢這個問題來展開講一講實現的思路。 為了數據安全我們在開發過程中經常會對重要的數據進行加密存儲&#xff0c;常見的有&#xff1a;密碼、手機號、電話號碼、詳細地址、銀行卡號、信用卡驗證碼等信息…

YoloV5改進策略:主干網絡改進|MogaNet——高效的多階門控聚合網絡

文章目錄 摘要論文:《MogaNet——高效的多階門控聚合網絡》1、簡介2、相關工作2.1、視覺Transformers2.2、ViT時代的卷積網絡3、從多階博弈論交互的角度看表示瓶頸4、方法論4.1、MogaNet概述4.2、多階門控聚合4.3、通過通道聚合進行多階特征重新分配4.4、實現細節5、實驗5.1、…

Vue 3 中的 setup 函數是如何工作的?

Vue 3 中的 setup 函數是一個新的組件選項&#xff0c;用于使用組合式 API 定義組件的邏輯。這個函數的引入是為了解決 Vue 2 中隨著組件復雜度的增長&#xff0c;選項式的 API 可能導致代碼難以維護和理解的問題。通過 setup 函數&#xff0c;開發者可以更加靈活地組織和共享代…

Python光速入門 - Flask輕量級框架

FlASK是一個輕量級的WSGI Web應用程序框架&#xff0c;Flask的核心包括Werkzeug工具箱和Jinja2模板引擎&#xff0c;它沒有默認使用的數據庫或窗體驗證工具&#xff0c;這意味著用戶可以根據自己的需求選擇不同的數據庫和驗證工具。Flask的設計理念是保持核心簡單&#xff0c…

布隆過濾器實戰

一、背景 本篇文章以解決實際需求的問題的角度進行切入&#xff0c;探討了如果使用布隆過濾器快速丟棄無效請求&#xff0c;降低了系統的負載以及不必要的流量。 我們都知道布隆過濾器是以占用內存小&#xff0c;同時也能夠實現快速的過濾從而滿足我們的需求&#xff0c;本篇…

Matlab偏微分方程擬合 | 源碼分享 | 視頻教程

專欄導讀 作者簡介&#xff1a;工學博士&#xff0c;高級工程師&#xff0c;專注于工業軟件算法研究本文已收錄于專欄&#xff1a;《復雜函數擬合案例分享》本專欄旨在提供 1.以案例的形式講解各類復雜函數擬合的程序實現方法&#xff0c;并提供所有案例完整源碼&#xff1b;2.…

反編譯代碼格式處理

反編譯代碼格式處理 背景解決方案程序跑之后idea格式化 總結 背景 想看看公司里一個工具的代碼實現&#xff0c;手里只有一個jar包&#xff0c;只能通過jd-gui反編譯代碼。但是呢&#xff0c;源碼是有了&#xff0c;但是看的很難受。 解決方案 /*** 替換 {code searchDir}中…

LeetCode 100231.超過閾值的最少操作數 I

給你一個下標從 0 開始的整數數組 nums 和一個整數 k 。 一次操作中&#xff0c;你可以刪除 nums 中的最小元素。 你需要使數組中的所有元素都大于或等于 k &#xff0c;請你返回需要的 最少 操作次數。 示例 1&#xff1a; 輸入&#xff1a;nums [2,11,10,1,3], k 10 輸…