神經網絡——卷積層

目錄

卷積層介紹

Conv2d

卷積動畫演示

卷積代碼演示?

綜合代碼案例


卷積層介紹

卷積層是卷積神經網絡(CNN)的核心組件,它通過卷積運算提取輸入數據的特征

基本原理

卷積層通過卷積核(過濾器)在輸入數據(如圖像)上滑動,進行逐元素乘法并求和,從而提取局部特征。每個卷積核學習不同的特征(如邊緣、紋理),最終生成多個特征圖

  • 局部連接:卷積核只關注輸入的局部區域,減少參數數量。

  • 權值共享:同一個卷積核在整個輸入上滑動,降低過擬合風險。

  • 特征提取:不同卷積核可以檢測不同特征,如水平邊緣、垂直邊緣等。

核心參數

  • 卷積核大小:通常為 3x3、5x5 等,決定感受野。

  • 步長(Stride):卷積核滑動的步距,影響輸出尺寸。

  • 填充(Padding):在輸入周圍添加零值,控制輸出尺寸與輸入一致。

  • 卷積核數量:決定輸出特征圖的通道數。

?


?

Conv2d

Conv2d:二維卷積操作

相關參數如下:?

參數:

  • in_channels?(int) – 輸入圖像中的通道數

  • out_channels?(int) – 卷積產生的通道數

  • kernel_size?(int?或?tuple) – 卷積核的大小

  • stride?(int?或?tuple,?可選的) – 卷積的步長。默認值:1

  • padding?(int,?tuple?或?str,?可選的) – 輸入四邊添加的填充。默認值:0

  • dilation?(int?或?tuple,?可選的) – 內核元素之間的間距。默認值:1

  • groups?(int,?可選的) – 從輸入通道到輸出通道的組連接數。默認值:1

  • bias?(bool,?可選的) – 如果為?True,則向輸出添加一個可學習的偏置項。默認值:True

  • padding_mode?(str,?可選的) –?'zeros',?'reflect',?'replicate'?或?'circular'。默認值:'zeros'

?


?

卷積動畫演示

注意:藍色映射是輸入,青色映射是輸出。

? ? ? ?No padding, no strides? ? ? ? ? ? ? ? ? ? ?? Arbitrary padding, no strides

? ? ??沒有填充,沒有步幅? ? ? ? ? ? ? ? ? ? ? ? ? ?任意填充,無步幅

? ? ? ? ? Half padding, no strides? ? ? ? ? ? ? ? Full padding, no strides

? ? ? ? ?半填充,無步幅? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??全填充,無步幅

? ? ? ? No padding, strides? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Padding, strides

? ? ? ? ?沒有填充,沒有步幅? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?填充、步幅

?

? ? ?Padding, strides (odd)

? ? ?填充、步幅(奇數)


?

卷積代碼演示?

import torch
import torch.nn.functional as Finput = torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1]
])kernel = torch.tensor([[1, 2, 1],[0, 1, 0],[2, 1, 0]
])print(input.shape)
print(kernel.shape)
"""
打印結果:
torch.Size([5, 5])
torch.Size([3, 3])
不符合卷積層的輸入要求
在最簡單的情況下,輸入尺寸為 (N,C,H,W)
N:批量數
C:通道數
H:高度
W:寬度
"""# 尺寸變換
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
print(input.shape)
print(kernel.shape)
"""
打印結果:
torch.Size([1, 1, 5, 5])
torch.Size([1, 1, 3, 3])
"""output = F.conv2d(input, kernel, stride=1)
print(output)
"""
打印結果:
tensor([[[[10, 12, 12],[18, 16, 16],[13,  9,  3]]]])
"""
# stride為2時
output2 = F.conv2d(input, kernel, stride=2)
print(output2)
"""
打印結果:
tensor([[[[10, 12],[13,  3]]]])
"""

卷積操作分析:?


當設置了padding時候?,輸入的量得到了填充 默認填充為0

進行卷積操作的時候,還是從左上角開始?

# 設置padding
output3=F.conv2d(input,kernel,stride=1,padding=1)
print(output3)
"""
打印結果:
tensor([[[[ 1,  3,  4, 10,  8],[ 5, 10, 12, 12,  6],[ 7, 18, 16, 16,  8],[11, 13,  9,  3,  4],[14, 13,  9,  7,  4]]]])
"""

?

綜合代碼案例

?

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("../torchvision_dataset", train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset, batch_size=64)class MyModel(nn.Module):def __init__(self):super().__init__()self.conv1 = Conv2d(3, 6, 3, stride=1, padding=0)def forward(self, x):x = self.conv1(x)return xmodule1 = MyModel()
step = 0
writer = SummaryWriter("logs_test3")
for data in dataloader:imgs, target = dataoutput = module1(imgs)print("卷積前", imgs.shape)print("卷積后", output.shape)# 卷積前 torch.Size([64, 3, 32, 32])writer.add_images("input", imgs, step)# 卷積后 torch.Size([64, 6, 30, 30])# 直接用會報錯 因為6通道不好顯示# 一個不嚴謹的方法:reshape為3通道# [64, 6, 30, 30]->[***, 3, 30, 30]output = torch.reshape(output, (-1, 3, 30, 30))  # 參數為-1時,會根據后面的自己計算writer.add_images("output", output, step)step += 1

?

?在卷積操作中,輸出通道數由卷積核的數量決定

每個輸出通道由一個卷積核掃描 3 個輸入通道后求和

輸入: 32×32×3(3通道)┌───────────┐    ┌───────────┐    ┌───────────┐│  紅通道   │    │  綠通道   │    │  藍通道   ││ 32×32×1   │    │ 32×32×1   │    │ 32×32×1   │└───────────┘    └───────────┘    └───────────┘│                 │                 │└────────┬────────┴────────┬────────┘│                 │6個3×3×3卷積核          ││                 │┌────────┴─────────────────┘▼
輸出: 30×30×6(6通道)┌───────────┐    ┌───────────┐    ┌───────────┐│ 特征圖1   │    │ 特征圖2   │    │ 特征圖3   ││ 30×30×1   │    │ 30×30×1   │    │ 30×30×1   │└───────────┘    └───────────┘    └───────────┘│                 │                 │┌───────────┐    ┌───────────┐    ┌───────────┐│ 特征圖4   │    │ 特征圖5   │    │ 特征圖6   ││ 30×30×1   │    │ 30×30×1   │    │ 30×30×1   │└───────────┘    └───────────┘    └───────────┘

?3*3*3卷積核的理解:

不是3個一樣的3*3的子核(每一個子核也不一樣),也不是3個卷積核

一個完整的卷積核是包含所有輸入通道對應子核的集合,而不是單個通道的子核。

輸出第 1 個通道的特征圖,就是由 “第 1 個完整卷積核”(包含 3 個子核)分別對 RGB 三個通道計算后相加得到的。

“卷積核” 指的是對應 1 個輸出通道的整體結構(3×3×3),而子核只是其內部組成部分。就像 “1 輛汽車由 4 個輪子組成,但我們說‘1 輛車’而不是‘4 個輪子’”—— 這里的邏輯是一致的。


調用前后圖片尺寸發生變化

?

圖像尺寸從 32×32 變為 30×30 是由卷積操作的數學特性決定的。因為使用了3×3 的卷積核且沒有添加填充(padding=0),導致邊緣像素無法被卷積核完全覆蓋。?

計算輸出尺寸的公式:?

輸出尺寸 = 向下取整[(輸入尺寸 - 卷積核大小 + 2×填充) ÷ 步長] + 1

官方公式:

?

?


?

為什么需要多個輸出通道?

卷積神經網絡的核心思想是用多個卷積核提取不同的特征。每個輸出通道對應一個獨特的卷積核,它會學習檢測特定的模式(如邊緣、紋理、顏色等)。

例如:

  • 第 1 個卷積核可能學會檢測水平邊緣。

  • 第 2 個卷積核可能學會檢測垂直邊緣。

  • 第 3-6 個卷積核可能學會檢測更復雜的紋理或顏色模式。

?

?

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

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

相關文章

神經網絡——線性層

在機器學習中,線性層(Linear Layer) 是一種基礎的神經網絡組件,也稱為全連接層(Fully Connected Layer) 或密集層(Dense Layer)。 其嚴格的數學定義為:對輸入數據執行線…

大模型高效適配:軟提示調優 Prompt Tuning

The Power of Scale for Parameter-Efficient Prompt Tuning ruatishi 軟提示向量 具體是什么 《The Power of Scale for Parameter-Efficient Prompt Tuning》中增加的部分是“軟提示(soft prompts)”,這是一種針對特定下游任務,添加到輸入文本中的可調參數序列。它與傳統…

https正向代理 GoProxy

背景: 在安全隔離的內網環境中,部署于內網的應用如需調用公網第三方接口(如支付、短信),可通過正向代理服務實現訪問。 GoProxy 下載: https://github.com/snail007/goproxy/releases 使用文檔&#xff…

Java IO流體系詳解:字節流、字符流與NIO/BIO對比及文件拷貝實踐

一、字節流與字符流:如何選擇? 1.1 核心區別特性字節流字符流處理單位字節(8位)字符(16位Unicode)適用場景二進制文件(圖片/視頻)文本文件(TXT/CSV)編碼處理需…

QT6 源,七章對話框與多窗體(5) 文件對話框 QFileDialog 篇二:源碼帶注釋

&#xff08;13&#xff09;本源代碼定義于頭文件 qfiledialog . h &#xff1a; #ifndef QFILEDIALOG_H #define QFILEDIALOG_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtCore/qdir.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h…

關于Ajax的學習筆記

Ajax概念&#xff1a;是一門使用了js語言&#xff0c;可以使用于Javaweb&#xff0c;實現前端代碼和后端代碼連結的的一種異步同步&#xff08;不需要等待服務器相應&#xff0c;就能夠發送第二次請求&#xff09;的一種技術&#xff0c;它主要用于網頁內容的局部刷新&#xff…

The Missing Semester of Your CS Education 學習筆記以及一些拓展知識(三)

文章目錄The Missing Semester of Your CS Education 學習筆記以及一些拓展知識Vim編輯器筆記部分程序員常用的編輯器Vim的模式Vim的普通模式Vim的插入模式Vim的可視模式Vim的替換模式Vim的命令行模式Vim的高級功能文本對象宏寄存器緩沖區標記代碼折疊Vim的常用配置Vim的常用插…

PyTorch常用的簡單數學運算

一、基礎算術運算1. 逐元素運算a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6])# 加減乘除 a b # [5, 7, 9] a - b # [-3, -3, -3] a * b # [4, 10, 18] a / b # [0.25, 0.4, 0.5]# 冪運算、平方根 a ** 2 # [1, 4, 9] torch.sqrt(a) # [1.0, 1.414, 1.732]2. 標…

C++ Lambda 表達式詳解:從基礎到實戰

Lambda 表達式是 C11 引入的重要特性&#xff0c;它允許我們在代碼中定義匿名函數&#xff0c;極大地簡化了代碼編寫&#xff0c;尤其是在使用 STL 算法和多線程編程時。本文將詳細介紹 Lambda 表達式的語法、特性及實際應用場景。什么是 Lambda 表達式&#xff1f;Lambda 表達…

Spring Boot注解詳解

文章目錄前言1. 核心啟動注解SpringBootApplicationEnableAutoConfigurationSpringBootConfiguration2. 組件注解Component及其衍生注解ComponentServiceRepositoryControllerRestController3. 依賴注入注解AutowiredQualifierPrimary4. Web相關注解請求映射注解RequestMapping…

Web開發:ABP框架12——中間件Middleware的創建和使用

一、簡介中間件可以用于鑒權、日志&#xff0c;攔截器可以用于指定方法或url的業務邏輯處理&#xff0c;兩者分工不同&#xff0c;實現效果相似&#xff0c;先執行中間件&#xff0c;后執行攔截器&#xff0c;再到WebAPI接口。二、示例一個Token驗證中間件三、代碼1.Startup.cs…

京東商品評論如何獲取?API接口實戰指南

一、API接入準備1. 注冊開發者賬號訪問京東開放平臺&#xff1a;前往京東開放平臺注冊賬號&#xff0c;完成企業或個人實名認證。創建應用&#xff1a;在控制臺創建應用&#xff0c;獲取App Key和App Secret&#xff08;用于簽名認證&#xff09;。2. 申請API權限搜索接口&…

leetcode-sql-627變更性別

題目&#xff1a; Salary 表&#xff1a; --------------------- | Column Name | Type | --------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | --------------------- id 是這個表的主鍵…

【學習路線】C#企業級開發之路:從基礎語法到云原生應用

一、C#基礎入門&#xff08;1-2個月&#xff09; &#xff08;一&#xff09;開發環境搭建Visual Studio安裝配置 Visual Studio Community&#xff1a;免費版本&#xff0c;功能完整Visual Studio Code&#xff1a;輕量級&#xff0c;跨平臺支持JetBrains Rider&#xff1a;專…

Planning Agent:基于大模型的動態規劃與ReAct機制,實現復雜問題自適應執行求解

引言 在當今數據驅動的商業環境中&#xff0c;企業面臨著日益復雜的決策問題。傳統的數據分析工具往往難以應對多步驟、多依賴的復雜問題求解。例如&#xff0c;當企業需要分析"北美市場 Q1-Q2 主要產品的銷售增長趨勢并識別關鍵驅動因素"時&#xff0c;傳統工具可能…

人該怎樣活著呢?55

人該怎樣活著呢&#xff1f; A思考現實問題并記錄自己的靈感 。【生活的指南針】 &#xff08;20250212&#xff09; a1如何思考&#xff1f; 當有人問他用什么方法得到那么多發現時&#xff0c;牛頓說&#xff1a;“我只不過對于一件事情&#xff0c;總是花很長時間很熱…

rtthread - V5.1.0版本 HOOK 鉤子函數總結

rtthread - V5.1.0版本 鉤子函數 相對于V4.0.3版本做了很大的修改和優化&#xff1a;舊版本 V4.0.3&#xff1a;rt_thread_inited_sethook(thread_inited_hook);rt_thread_deleted_sethook(thread_deleted_hook);rt_scheduler_sethook(scheduler_hook);新版本 V5.1.0&#xff1…

Python特性:裝飾器解決數據庫長時間斷連問題

前言 在基于 Python 的 Web 應用開發里&#xff0c;數據庫連接是極為關鍵的一環。不過&#xff0c;像網絡波動、數據庫服務器維護這類因素&#xff0c;都可能造成數據庫長時間斷連&#xff0c;進而影響應用的正常運作。本文將詳細介紹怎樣運用 retry_on_failure 裝飾器來解決數…

療愈之手的智慧覺醒:Deepoc具身智能如何重塑按摩機器人的觸覺神經

療愈之手的智慧覺醒&#xff1a;Deepoc具身智能如何重塑按摩機器人的觸覺神經康復中心的理療室內&#xff0c;一位運動員正俯臥在治療床上。機械臂的硅膠觸頭沿腰背肌群緩緩移動&#xff0c;當傳感器捕捉到豎脊肌的異常僵直時&#xff0c;觸頭自動切換高頻震顫模式&#xff1b;…

webpack將組件vue進行編譯混淆,并能正常使用編譯之后的文件

介紹: 我們在開發的過程中有很多組件都需要復用,特別是我們耗費了好幾天時間寫出來的組件,比如自己寫的表格組件,流程圖組件等。總之都是自己不斷測試,不斷編寫耗費了大把的精力寫的。直接用到自己的項目中倒是無所謂,如果是把自己寫的組件給別人,這里就涉及到自己的勞動…