深度學習-卷積神經網絡-LeNet

卷積神經網絡是一種專門用于處理具有網格結構數據(如圖像、音頻等)的深度學習模型。它通過卷積層自動提取數據中的特征,利用局部連接和參數共享的特性減少了模型的參數數量,降低了過擬合的風險,同時能夠有效地捕捉數據中的空間層次結構信息,使得模型在圖像識別、分類等任務中表現出色。而 LeNet 作為 CNN 的經典代表,具有開創性的意義

LeNet 由 Yann LeCun 等人在 1998 年提出,最初是用于手寫數字識別任務。它的出現為后續 CNN 的發展奠定了基礎,展示了 CNN 在圖像識別領域的巨大潛力,引領了深度學習在圖像處理方面的發展潮流。

一般來說,高寬減少時,會把通道數加倍。即可以理解為:特征分成兩份。(紅且大==>紅 + 大)

總體來看,LeNet(LeNet-5)由兩個部分組成:

  • 卷積編碼器:由兩個卷積層組成;

  • 全連接層密集塊:由三個全連接層組成。

網絡結構組成

  • 輸入層:接收原始的手寫數字圖像,通常是 32×32 像素的灰度圖像。

  • 卷積層1(C1):包含 6 個 5×5 的卷積核,用于提取圖像的邊緣、線條等低級特征。每個卷積核與輸入圖像進行卷積操作,產生 6 個特征圖,每個特征圖的大小為 28×28。卷積操作通過滑動窗口的方式對圖像進行掃描,計算卷積核與窗口內像素值的點積,從而實現特征提取。

  • 池化層1(S2):采用平均池化,池化窗口大小為 2×2,步長為 2。對 C1 層輸出的 6 個特征圖分別進行池化操作,將每個特征圖的大小縮小為 14×14。池化的作用是降低特征圖的空間分辨率,減少計算量和參數數量,同時具有一定的平移不變性,使模型對圖像的微小位移具有魯棒性。

  • 卷積層2(C3):包含 16 個 5×5 的卷積核,這些卷積核不僅與 S2 層的部分特征圖相連,而且每個卷積核連接的特征圖組合不同。這樣的設計可以提取更高級的特征,如紋理、角點等組合特征。卷積操作后得到 16 個大小為 10×10 的特征圖。

  • 池化層2(S4):同樣采用平均池化,池化窗口大小為 2×2,步長為 2。對 C3 層的 16 個特征圖進行池化,得到 16 個 5×5 的特征圖。進一步縮小特征圖尺寸,提取更具有語義信息的特征。

  • 全連接層(F5):將 S4 層輸出的 16 個 5×5 特征圖展平成一個向量,包含 400 個神經元。然后與本層的 120 個神經元進行全連接,主要用于對提取到的高級特征進行進一步的組合和抽象,實現更復雜的識別。

  • 全連接層(F6):包含 84 個神經元,與前一層的 120 個神經元全連接。在實際應用中,根據具體的任務需求,如手寫數字識別,該層可以進一步連接到輸出層,即全連接層F7,輸出對應類別的概率分布,例如對于 10 個數字類別(0 - 9),輸出層可以使用 softmax 激活函數計算每個數字的概率。

import torch
from torch import nn
from d2l import torch as d2lnet = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),nn.AvgPool2d(kernel_size=2, stride=2),nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),nn.AvgPool2d(kernel_size=2, stride=2),nn.Flatten(),nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),nn.Linear(120, 84), nn.Sigmoid(),nn.Linear(84, 10))
X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:X = layer(X)print(layer.__class__.__name__,'output shape: \t',X.shape)輸出:
Conv2d output shape:         torch.Size([1, 6, 28, 28])
Sigmoid output shape:        torch.Size([1, 6, 28, 28])
AvgPool2d output shape:      torch.Size([1, 6, 14, 14])Conv2d output shape:         torch.Size([1, 16, 10, 10])
Sigmoid output shape:        torch.Size([1, 16, 10, 10])
AvgPool2d output shape:      torch.Size([1, 16, 5, 5])Flatten output shape:        torch.Size([1, 400])
Linear output shape:         torch.Size([1, 120])
Sigmoid output shape:        torch.Size([1, 120])
Linear output shape:         torch.Size([1, 84])
Sigmoid output shape:        torch.Size([1, 84])
Linear output shape:         torch.Size([1, 10])

在整個卷積塊中,與上一層相比,每一層特征的高度和寬度都減小了。

第一個卷積層使用2個像素的填充,來補償卷積核導致的特征減少。

相反,第二個卷積層沒有填充,因此高度和寬度都減少了4個像素。

隨著層疊的上升,通道的數量從輸入時的1個,增加到第一個卷積層之后的6個,再到第二個卷積層之后的16個。

同時,每個匯聚層的高度和寬度都減半。

最后,每個全連接層減少維數,最終輸出一個維數與結果分類數相匹配的輸出。

訓練過程:

代碼來自《動手學深度學習》

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)
def evaluate_accuracy_gpu(net, data_iter, device=None): #@save    """使用GPU計算模型在數據集上的精度"""if isinstance(net, nn.Module):net.eval()  # 設置為評估模式if not device:device = next(iter(net.parameters())).device# 正確預測的數量,總預測的數量metric = d2l.Accumulator(2)with torch.no_grad():for X, y in data_iter:if isinstance(X, list):# BERT微調所需的(之后將介紹)X = [x.to(device) for x in X]else:X = X.to(device)y = y.to(device)metric.add(d2l.accuracy(net(X), y), y.numel())return metric[0] / metric[1]
#@save
def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):"""用GPU訓練模型"""def init_weights(m):if type(m) == nn.Linear or type(m) == nn.Conv2d:nn.init.xavier_uniform_(m.weight)net.apply(init_weights)print('training on', device)net.to(device)optimizer = torch.optim.SGD(net.parameters(), lr=lr)loss = nn.CrossEntropyLoss()animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],legend=['train loss', 'train acc', 'test acc'])timer, num_batches = d2l.Timer(), len(train_iter)for epoch in range(num_epochs):# 訓練損失之和,訓練準確率之和,樣本數metric = d2l.Accumulator(3)net.train()for i, (X, y) in enumerate(train_iter):timer.start()optimizer.zero_grad()X, y = X.to(device), y.to(device)y_hat = net(X)l = loss(y_hat, y)l.backward()optimizer.step()with torch.no_grad():metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])timer.stop()train_l = metric[0] / metric[2]train_acc = metric[1] / metric[2]if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:animator.add(epoch + (i + 1) / num_batches,(train_l, train_acc, None))test_acc = evaluate_accuracy_gpu(net, test_iter)animator.add(epoch + 1, (None, None, test_acc))print(f'loss {train_l:.3f}, train acc {train_acc:.3f}, 'f'test acc {test_acc:.3f}')print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec 'f'on {str(device)}')
lr, num_epochs = 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())輸出:
loss 0.469, train acc 0.823, test acc 0.779
55296.6 examples/sec on cuda:0
  • 卷積神經網絡(CNN)是一類使用卷積層的網絡。

  • 在卷積神經網絡中,我們組合使用卷積層、非線性激活函數和匯聚層。

  • 為了構造高性能的卷積神經網絡,通常對卷積層進行排列,逐漸降低其表示的空間分辨率,同時增加通道數。

  • 傳統的卷積神經網絡的卷積塊編碼得到的表征在輸出之前需由一個或多個全連接層進行處理

  • LeNet是最早發布的卷積神經網絡之一。

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

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

相關文章

【Java項目與數據庫、Maven的關系詳解】

Java項目與數據庫、Maven的關系詳解 一、Java項目是否都需要連接本地數據庫? 不一定,這取決于項目類型和需求: 1. 需要數據庫的項目類型項目類型數據庫作用典型場景Web應用存儲用戶數據/業務數據電商系統、CMS服務端程序持久化數據金融交易系…

兩個Maven工程,使用idea開發,工程A中依賴了工程B,改了工程B,工程A如何獲取最新代碼

兩個Maven工程,使用idea開發,工程A中依賴了工程B,改了工程B,工程A如何獲取最新代碼 如果工程B的版本是快照,那么如下。 步驟一 工程B 執行 clean package install deploy 步驟二 工程A 刷新Maven

奧比中光與地平線、地瓜機器人達成戰略合作,攜手推動機器人智能化

摘要:機器人“慧眼”與“智腦”強強聯合!8月11日,奧比中光與地平線及其控股子公司地瓜機器人在北京簽訂合作協議,雙方將在機器人智能化領域展開深度合作,充分發揮各自的技術與產品優勢,攜手推動機器人產業的…

【Linux】Tomcat

Tomcat簡介Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和 并發訪問用戶不是很多的場合下被普遍使用,Tomcat 具有處理HTML頁面的功能,它還是一個Servlet和 JSP容器Tomcat的使用安裝ja…

Putting it all together 將所有內容整合在一起

官方鏈接 https://www.youtube.com/watch?vAa_FAA3v22g&t1s Task1 Putting It All Together 將所有內容整合在一起 圖片版 文字版 Putting It All Together 將所有內容整合在一起 From the previous modules, youll have learned that quite a lot of things go on b…

Python 閉包詳解:從變量作用域到實戰案例

一、變量作用域基礎在 Python 中,變量根據作用范圍可分為三類:全局變量:定義在函數外部的變量,作用范圍是整個程序。如果在函數內部需要修改全局變量,必須使用global關鍵字聲明。局部變量:定義在函數內部的…

Docker 跨主機容器之間的通信macvlan

默認一個物理網卡,只有一個物理mac地址,虛擬多個mac地址 缺點:每次需要手動配置ip地址,容易ip地址沖突。類似于保存到execl表格里面。 兩臺物理機: docker-01和docker-02 創建macvlan網絡 [rootdocker-01 ~]# docker n…

android 換膚框架詳解1-換膚邏輯基本

android 換膚框架詳解1-換膚邏輯基本-CSDN博客 android 換膚框架詳解2-LayoutInflater源碼解析-CSDN博客 android 換膚框架詳解3-自動換膚原理梳理-CSDN博客 換膚框架流程 1,通過AssetManager獲取換膚的資源文件 2,通過原文件中的resId獲取到res名稱…

NEON性能優化總結

轉自 NEON優化:性能優化經驗總結-CSDN博客 NEON優化:性能優化經驗總結 1. 什么是 NEON Arm Adv SIMD 歷史 2. 寄存器 3. NEON 命名方式 4. 優化技巧 5. 優化 NEON 代碼(Armv7-A內容,但區別不大) 5.1 優化 NEON 匯編代碼 …

計算機網絡摘星題庫800題筆記 第2章 物理層

第2章 物理層2.1 物理層概述題組闖關1.采用以下哪種設備,可以使數字信號傳輸得更遠 ( )。 A. 放大器 B. 中繼器 C. 網橋 D. 路由器1.【參考答案】B 【解析】選項 A 放大器只是單純地放大信號、抑制噪音和干擾。選項 B 中繼器是把一根線纜中的電或者光信號傳遞給另一…

導入文件到iPhone實現

我們有時候開發需要加載一些自己的文件&#xff0c;這個時候就需要導入文件到iPhone等設備。在info里面open as source code&#xff0c;加入如下配置&#xff1a;<!-- 開啟 iTunes / Finder 文件共享 --><key>UIFileSharingEnabled</key><true/>或者o…

Ubuntu Server系統安裝磁盤分區方案

最近打算把家里的舊電腦利用起來&#xff0c;裝上Ubuntu Server 24.04.3 LTS作為一個家用NAS服務器&#xff0c;但是給舊電腦安裝系統時遇到了一些問題&#xff0c;遂記錄下來 GPT分區與MBR分區 GPT 指的是 GUID Partition Table&#xff08;全局唯一標識分區表&#xff09;&am…

1小時 MySQL 數據庫基礎速通

目錄 一、MySQL安裝配置 1、下載mysql 2、下載mysql-shell 二、MySQL基本概念 1. 數據庫&#xff08;Database&#xff09; 2. 表&#xff08;Table&#xff09; 3. 數據類型&#xff08;Data Type&#xff09; 4. 主鍵&#xff08;Primary Key&#xff09; 5. 索引&am…

HTTP應用層協議-長連接

HTTP應用層協議-長連接 關于 connection 報頭 HTTP 中的 Connection 字段是 HTTP 報文頭的一部分&#xff0c;它主要用于控制和管理客戶端與服務器之間的連接狀態 核心作用 ? 管理持久連接&#xff1a;Connection 字段還用于管理持久連接&#xff08;也稱為長連接&#xff09;…

2020/12 JLPT聽力原文 問題一 4番

4番&#xff1a;ホテルの受付で女の人と男の人が話しています。女の人はどこでパソコンを使いますか。女&#xff1a;すみません、パソコンの貸出ってできますか。部屋で仕事をしたいんですけど。 男&#xff1a;申し訳ございません。貸出はしていないんですが、二階にビジネス…

《在 Spring Boot 中安全使用 Qwen API-KEY:環境變量替代明文配置的最佳實踐》

《在 Spring Boot 中安全使用 Qwen API-KEY&#xff1a;環境變量替代明文配置的最佳實踐》 想要的效果其實就是 把 Qwen API-KEY 放到系統環境變量中&#xff0c;然后在 application.yml 里通過占位符讀取&#xff0c;而不寫明文。 這樣即便 application.yml 被提交到 Git&…

Nginx 反向代理與負載均衡架構

一、反向代理基礎 實驗目的&#xff1a;通過 Nginx 反向代理&#xff0c;將客戶端請求按類型&#xff08;靜態頁面 / 動態 PHP 頁面&#xff09;轉發到不同的后端服務器&#xff08;RS1 處理靜態資源&#xff0c;RS2 處理動態請求&#xff09;&#xff0c;實現 “客戶端只與代…

【Mybatis入門】配置Mybatis(IDEA)

Mybatis和JDBC一樣&#xff0c;是連接數據庫的工具。它是一款優秀的持久層框架&#xff0c;主要用于 Java 語言中簡化數據庫操作&#xff0c;實現對象與數據庫表之間的映射。Mybatis相比于JDBC的優勢Mybatis消除了傳統 JDBC 代碼中繁瑣的手動處理、參數設置、結果集解析等重復工…

多路轉接之epoll 【接口】【細節問題】【LT與ET模式】【Reactor】

目錄 一.接口 1.1epoll_creaet 1.2epoll_ctl 1.3epoll_wait 二.細節問題 2.1 工作原理 2.2 epoll的demo 2.3 epoll的優點 三. LT 與 ET模式 理解ET 四. reactor 一.接口 1.1epoll_creaet 注意返回值是一個文件描述符 創建一個epoll模型 1.2epoll_ctl 返回值&…

滲透測試現已成為 CISO 戰略的核心

隨著數字供應鏈的擴展以及生成式人工智能在關鍵系統中的嵌入&#xff0c;安全領導者正在重新思考其網絡安全策略。Emerald Research 最近對 225 位安全領導者進行的一項調查發現&#xff0c;68% 的人擔心第三方軟件和組件帶來的風險。雖然大多數受訪者表示他們正在滿足監管要求…