Pytorch實戰四 基于 VGG net 搭建一個串聯的神經網絡結構

系列文章目錄


文章目錄

  • 系列文章目錄
  • 前言
  • 一、VGG類的搭建
    • 1.源碼
    • 2.初始化類
      • 2.1 初始化函數
      • 2.2 前向傳播函數 forward(self,x)
  • 二、卷積補充
    • 卷積


前言

??對于標準的 VGG net 輸入圖像的尺寸是 24 x 24,進行 32 維的下采樣之后得到一個 7 x 7 的特征圖,然后用 FC 層完成分類。在這里我們要對數據進行增強,然后 resize 到 28 * 28 的尺寸。如果直接使用 VGG net 沒有辦法直接進行 32 x 32 下采樣的。,下面我們來搭建這個串聯的網絡結構。


一、VGG類的搭建

1.源碼

import torch
import torch.nn.functional as F # 使用這個庫進行softmax
import torch.nn as nn    # 使用這個庫進行卷積# 定義類
class VggBase(nn.Module):def __init__(self):# 第一步初始化函數super(VggBase, self).__init__()# 定義一些列算子,每次經過一個pooling層卷積加倍# 第一個卷積采用序列, 輸入的數據 3 x 28 x 28 ,crop 之后self.conv1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3,padding=1),nn.BatchNorm2d(64), # 輸出的通道nn.ReLU())self.max_pooling1 = nn.MaxPool2d(kernel_size=2, stride=2) # 下采樣減半# 第一個卷積采用序列之后, 輸出的數據 14*14*64self.conv2_1 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=3,padding=1),nn.BatchNorm2d(128), # 輸出的通道nn.ReLU())# 目前卷積14*14*128self.conv2_2 = nn.Sequential(nn.Conv2d(128, 128, kernel_size=3,padding=1),nn.BatchNorm2d(128), # 輸出的通道nn.ReLU())self.max_pooling2= nn.MaxPool2d(kernel_size=2, stride=2)# 輸出 7*7*128self.conv3_1 = nn.Sequential(nn.Conv2d(128, 256, kernel_size=3,padding=1),nn.BatchNorm2d(256), # 輸出的通道nn.ReLU())# 目前卷積7*7*256self.conv3_2 = nn.Sequential(nn.Conv2d(256, 256, kernel_size=3,padding=1),nn.BatchNorm2d(256), # 輸出的通道nn.ReLU())# 由于圖片7*7奇數,需要padding = 1,防止損失self.max_pooling3= nn.MaxPool2d(kernel_size=2, stride=2,padding=1)# 輸出4*4*256self.conv4_1 = nn.Sequential(nn.Conv2d(256, 512, kernel_size=3,padding=1),nn.BatchNorm2d(512), # 輸出的通道nn.ReLU())# 目前卷積4*4*512self.conv4_2 = nn.Sequential(nn.Conv2d(512, 512, kernel_size=3,padding=1),nn.BatchNorm2d(512), # 輸出的通道nn.ReLU())self.max_pooling4= nn.MaxPool2d(kernel_size=2, stride=2)#全連接層,目前的數據 batch * 4 * 4 * 512 我們要變成--> batch * (4 * 512)self.fc1 = nn.Linear(4*512,10) # 第一個輸入參數的個數是 maxpooling之后特征圖的大小 512*2*2# 輸出 2*2*512def forward(self,x):# st1取出batch_size,就是x的第0維batch_size = x.size(0)#st2 定義輸出,取第一個卷積out = self.conv1(x)out = self.max_pooling1(out)out = self.conv2_1(out)out = self.conv2_2(out)out = self.max_pooling2(out)out = self.conv3_1(out)out = self.conv3_2(out)out = self.max_pooling3(out)out = self.conv4_1(out)out = self.conv4_2(out)out = self.max_pooling4(out)# 全連接層,開始變形out = out.view(batch_size,-1) # -1 會根據具體的維度進行計算 -1 就是把 batch * 2 *2 * 512變成 batch*(4*512) 也就是batch_size * nout = self.fc1(out)  # 實際上VGG有三個fc層,輸出結果 batch_size * 10out = F.log_softmax(out, dim=1)  #return outdef VGGNet():return VGGNet()

??網絡的搭建不難,一個初始化類和一個前向傳播函數,我覺得重點是要去理解一下形狀是怎么變化的。如何控制padding和stride來變化形狀,不知道的話,下面講解將會很難聽懂,去補基礎吧,哈哈哈哈,點擊這里,1-9集。

2.初始化類

2.1 初始化函數

重點在卷積層,定義了四個卷積層和4個池化層,卷積一次,采用序列定義卷積層。

self.conv1 = nn.Sequential(nn.Conv2d(3,64,kernel_size=3,padding=1),nn.BatchNorm2d(64), nn.ReLU())

  1. nn.Conv2d(3,64,kernel_size=3,padding=1)

    • 3代表輸入通道,此處RGB通道等于3
    • 64是輸出通道,也就是卷積核的數量
    • kernel_size = 3,卷積核的大小 3*3 的方陣
    • padding = 1,在圖片四周補一圈0,保證卷積不改變圖片尺寸,具體還得看情況。
    • 卷積的步長stride默認等于1,一般不調整。
  2. nn.BatchNorm2d(64) 歸一化函數,64是一定要與卷積之后的輸出通道相同。

  3. nn.ReLU() 激活函數,負數變0,正數不變。

池化層:降維,改變圖片大小,不改變通道數目

self.max_pooling1 = nn.MaxPool2d(kernel_size=2, stride=2)

  1. kernel_size=2 卷積核大小 2*2
  2. stride = 2, 向右移動兩個步長,卷積核多大就移動幾個步長。看教程一般都是2

后面無非就是重復多建立幾個層,卷積和池化唄,注意,VGGNet池化之后,圖片大小變少,下一次卷積時輸出通道翻倍(卷積核翻倍)

2.2 前向傳播函數 forward(self,x)

??前向傳播就是調用前向傳播函數,然后這個函數調用初始化中的操作算子,卷積池化,在卷積再池化 … 全鏈接層,分類或回歸。順序與初始化中的操作算子一樣,只不過全連接層要處理一下。
??張量tensor(batch, C, H,W)翻譯(一組圖片,特征數目,圖片豎高,圖片橫寬),第一步統計一組圖片的數量,就是第 0 維。為什么分批次?6w張圖片或者80w張,內存不夠,我們分組傳入圖片訓練。
??全鏈接層處理:

  1. out = self.fc1(out) 需要參數是(batch,n)目前是(batch,512,2,2)
  2. 張量處理:
    • 繼續卷積池化:(batch,512,2,2)變成(batch,1024,1,1)由于(1,1)=1個元素,即(batch,1024)
    • out = out.view(batch_size,-1) 自動轉化,最好是卷積吧。

out = self.fc1(out) 數據形成類別,形狀 batch *10,每張圖片在10個類別中都有數據,out = F.log_softmax(out, dim=1) 統計形成類別的概率,選擇最大相似度的打印。

二、卷積補充

卷積

??大家看了基礎視頻,我也發表一下我的看法。卷積就是特征提取,但是特征又是什么?我們熟悉一下一張圖片的輸入和張量。

圖 1 圖片分解

圖片的tensor張量=(batch, C, H,W)翻譯(一組圖片,特征數目,圖片豎高,圖片橫寬) 一組圖片的數量是不會改變的,改變的只有特征數目,圖片的大小(最后兩個維度控制),卷積的過程理解成特征提取變多,圖片變小,越是細小,特征細節越多嘛。開始可以理解成只有紅綠藍這三種特征。

圖 2 卷積

用一個卷積核33去和 R G B 這三張圖片的33區域做內積(對應位置相乘)再相加,三張圖片得到三個數,三個數再次求和得到一個元素,這就是卷積一個視野所得的新元素。然后滑動去卷積下一個元素,圖片像素不夠,為了防止遺漏細節還需要拓展叫做padding. padding = 1 ,在四周加一圈 0。比如這張 55 的圖片,33的卷積核,圖片大小只能是卷積核的倍數才能完美契合,否則需要拓展,拓展后可以比倍數多一點

在這里插入圖片描述

我們進行padding = 1,四周加一圈0,變成77,多了一點無妨。卷積后的圖片像素依舊是 55,如下圖所示。我們卷積一般不改變圖片大小,僅僅提升通道數目,特征數目。池化的時候才改變圖片大小。怎么加padding呢?有一個技巧,選擇卷積核中心,外擴,33 擴一圈,55 擴兩圈 實際上也只有 33,發現不成倍數就 擴建一圈padding = 1, 5 * 5 的卷積核大了,完全可以使用兩個33的卷積核代替,而且計算還小。

在這里插入圖片描述

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

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

相關文章

大學專業解讀——計算機

我們繼續,講講排名第二流行的新工科專業——計算機。說到計算機,可能所有人都知道,但具體到細分的專業類別,除了計算機科學,其實大多數人都是不了解的。 序: 計算機主要有如下幾個專業: 計算機…

Bootstrap 5學習教程,從入門到精通, Bootstrap 5 列表組(List Group)語法知識點及案例(14)

Bootstrap 5 列表組(List Group)語法知識點及案例 一、列表組基礎語法 列表組是Bootstrap中用于顯示一系列內容的靈活組件&#xff0c;常用于顯示菜單、導航或任何項目列表。 基本列表組結構 <ul class"list-group"><li class"list-group-item&quo…

FPGA基礎 -- Verilog 命名事件

Verilog 的“命名事件&#xff08;Named Events&#xff09;”機制 進行一次系統、專業的培訓。該機制在 Verilog 中是比較冷門但重要的仿真控制特性&#xff0c;主要用于 模塊間同步、行為仿真觸發、事件通信&#xff0c;在復雜的 Testbench、行為模型中尤為重要。 一、命名事…

《Go語言圣經》結構體

《Go語言圣經》結構體 一、結構體指針的高效應用 在處理大型結構體時&#xff0c;為避免內存復制&#xff0c;通常使用指針傳遞和返回結構體&#xff1a; // 通過指針傳入結構體&#xff0c;避免值拷貝 func Bonus(e *Employee, percent int) int {return e.Salary * percen…

Ascend上如何進行帶寬測試

1 工具安裝 1.1 下載鏈接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安裝指令&#xff1a; ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install設置環境變量&#xff1a; source /usr/local/Ascend/toolbox/set_env.…

生產BUG集

磁盤達到閾值導致ES無法刪除數據 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI與Selenium的智能開關狀態管理系統實踐

引言 在工業物聯網&#xff08;IIoT&#xff09;與自動化控制場景中&#xff0c;設備狀態的實時監控與自然語言指令執行是提升效率的關鍵。本文將介紹一種基于 FastAPI 和 Selenium 的智能設備狀態管理系統&#xff0c;通過大語言模型&#xff08;LLM&#xff09;解析用戶指令…

主體和債項均為“AAA”等級 海爾消金發行10億金融債

6月18日&#xff0c;繼年內發行ABS、落地ESG掛鉤銀團貸后&#xff0c;海爾消費金融&#xff08;以下簡稱“海爾消金”&#xff09;在金融市場上又邁出重要一步&#xff0c;成功簿記發行2025年首期規模達10億元金融債&#xff0c;且主體信用等級仍為“AAA”。這一舉措為海爾消金…

n8n:輕松自動化您的工作流

借助開源自動化利器 n8n&#xff0c;釋放重復勞動的生產力&#xff01; 引言 n8n 是一款免費、開源的工作流自動化工具&#xff0c;致力于幫助開發者和團隊通過連接各種應用和服務&#xff0c;實現重復任務的自動化處理。 它由 Jan Oberhauser 于 2019 年在德國柏林創建&…

Angular--Hello(TODO)

最近有個小錯誤&#xff0c;因為最近還是在看thingsboard&#xff0c;最近終于看到前端的代碼&#xff0c;突然發現怎么全是ts的文件&#xff0c;仔細一看原來并不是之前認為的AngularJS&#xff0c;而是Angular。。。我tm真的無語了&#xff0c;又要去重新學。。。 Angular的…

在 Linux 系統中通過 yum 安裝 Sublime Text

在 Linux 系統中通過 yum 安裝 Sublime Text 的步驟如下&#xff1a; ?步驟 1&#xff1a;導入 GPG 公鑰? sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg 這一步用于驗證軟件包的合法性。 ?步驟 2&#xff1a;添加 Sublime Text 的軟件倉…

面向自主多星對地觀測的多智能體強化學習

大家讀完覺的有幫助記得及時關注和點贊&#xff01;&#xff01;&#xff01; 抽象 近地軌道 &#xff08;LEO&#xff09; 衛星的指數級增長徹底改變了地球觀測 &#xff08;EO&#xff09; 任務&#xff0c;解決了氣候監測、災害管理等方面的挑戰。然而&#xff0c;多衛星系統…

flutter 短視頻相關插件選型

?插件名稱??核心優勢??缺點??短視頻場景適用性??推薦指數??video_player? (官方基礎庫)? 官方維護&#xff0c;跨平臺兼容性最佳&#xff08;iOS/Android/macOS&#xff09; ? 輕量級&#xff0c;無額外依賴&#xff0c;啟動速度快 ? 支持本地/網絡視頻、基礎播…

QTableView為例:Qt模型視圖委托(MVD)(Model-View-Delegate)

文章目錄 1. QT中的MVD模式2. View3. Model4. Delegate5. 以TableView為例 1. QT中的MVD模式 模型視圖委托&#xff08;MVD&#xff09;是Qt中特有的設計模式&#xff0c;類似MVC設計模式&#xff0c;將MVC設計模式中的Controller當做MVD中的Delegate&#xff0c;兩者的概念基…

uni-app總結3-項目新建運行調試

一、新建項目 通過HbuilderX新建 在點擊工具欄里的文件 -> 新建 -> 項目&#xff08;快捷鍵CtrlN&#xff0c;MacOS上是CMD N&#xff09;&#xff1a; 左測Tab選擇uni-app類型&#xff0c;輸入工程名&#xff0c;選擇模板&#xff0c;Vue版本選擇3&#xff0c;其他不…

LeetCode 每日一題打卡|若谷的刷題日記 4day--移動零

移動零 題目&#xff1a; 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1&#xff1a; 輸入: nums [0,1,0,3,12] 輸出: [1,3,1…

簡歷模板3——數據挖掘工程師5年經驗

姓名 / Your Name 數據挖掘工程師 | 5年經驗 | 推薦/畫像/反欺詐 &#x1f4de; 138-XXXX-XXXX | ?? your.emailexample.com | &#x1f310; github.com/yourname | &#x1f4cd; 北京 &#x1f3af; 個人簡介 / Summary 5年大廠數據挖掘工程經驗&#xff0c;碩士學歷&am…

Vue添加圖片作為水印

直接上代碼 把圖片作為水印 <div class"info-warp"><div class"image-container"><img src"https://img.shetu66.com/2023/06/28/1687920981963810.png" /><div class"watermark-layer"><imgv-for"…

Conda 常用命令大全:從入門到高效使用

Conda 常用命令大全&#xff1a;從入門到高效使用 Conda 是 Python 生態中最流行的環境管理工具之一&#xff0c;它不僅可以管理 Python 包&#xff0c;還能創建隔離的虛擬環境&#xff0c;適用于數據分析、機器學習、科學計算等場景。本文將介紹 Conda 的常用命令&#xff0c…

【系統更新】TDuckX2.7升級!DSL邏輯、自定義Webhook、AI考試來襲

No.1 支持自定義 DSL 公式 邏輯規則支持自定義 DSL&#xff0c;通過公式表達式構建復雜邏輯條件&#xff0c;能夠支持選項、矩陣、自增表單中的內容控制&#xff0c;可以滿足多變業務場景&#xff0c;極大提升了邏輯配置的靈活性。 No.2 擴展值新增“名稱字段” 在批量生成擴…