神經網絡 torch.nn---Convolution Layers

torch.nn — PyTorch 2.3 documentation

torch.nn - PyTorch中文文檔 (pytorch-cn.readthedocs.io)

torch.nn和torch.nn.functional的區別

  • torch.nn是對torch.nn.functional的一個封裝,讓使用torch.nn.functional里面的包的時候更加方便

  • torch.nn包含了torch.nn.functional,打個比方,torch.nn.functional相當于開車的時候齒輪的運轉,torch.nn相當于把車里的齒輪都封裝好了,為我們提供一個方向盤

  • 如果只是簡單應用,會torch.nn就好了。但要細致了解卷積操作,需要深入了解torch.nn.functional

  • 打開torch.nn.functional的官方文檔,可以看到許多跟卷積相關的操作:torch.nn.functional — PyTorch 2.3 documentation

torch.nn中Convolution Layers 卷積層

  1. 一維卷積層 torch.nn.Conv1d
  2. 二維卷積層 torch.nn.Conv2d
  3. 三維卷積層 torch.nn.Conv3d

一維卷積層 torch.nn.Conv1d

class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

一維卷積層,輸入的尺度是(N, C_in,L),輸出尺度( N,C_out,L_out)的計算方式:

說明

  • bigotimes: 表示相關系數計算
  • stride: 控制相關系數的計算步長
  • dilation: 用于控制內核點之間的距離,詳細描述在這里
  • groups: 控制輸入和輸出之間的連接,?group=1,輸出是所有的輸入的卷積;group=2,此時相當于有并排的兩個卷積層,每個卷積層計算輸入通道的一半,并且產生的輸出是輸出通道的一半,隨后將這兩個輸出連接起來。

Parameters:

  • in_channels(int) – 輸入信號的通道
  • out_channels(int) – 卷積產生的通道
  • kerner_size(int?or?tuple) - 卷積核的尺寸
  • stride(int?or?tuple,?optional) - 卷積步長
  • padding (int?or?tuple,?optional)- 輸入的每一條邊補充0的層數
  • dilation(int?or?tuple, `optional``) – 卷積核元素之間的間距
  • groups(int,?optional) – 從輸入通道到輸出通道的阻塞連接數
  • bias(bool,?optional) - 如果bias=True,添加偏置

shape:
輸入: (N,C_in,L_in)
輸出: (N,C_out,L_out)
輸入輸出的計算方式:

變量:
weight(tensor) - 卷積的權重,大小是(out_channels,?in_channels,?kernel_size)
bias(tensor) - 卷積的偏置系數,大小是(out_channel

二維卷積層

1、torch.nn.functional.conv2d?

torch.nn.functional.conv2d(input,?weight,?bias=None,?stride=1,?padding=0,?dilation=1,?groups=1)

對幾個輸入平面組成的輸入信號應用2D卷積。

參數:

  • input: 輸入,數據類型為tensor,形狀尺寸規定為:(minibatch, 幾個通道(in_channels), 高, 寬)

  • weight: 權重。更專業地來說可以叫卷積核,形狀尺寸規定為:(輸出的通道(out_channel),?in_channels/groups(groups一般取1), 高kH, 寬kW)

  • bias: 偏置。可選偏置張量 (out_channels)?

  • strids: 步幅。卷積核的步長,可以是單個數字或一個元組 (sh x sw)

  • padding: 填充。默認為1 -?padding?– 輸入上隱含零填充。可以是單個數字或元組。

  • 默認值:0 -?groups?– 將輸入分成組,in_channels應該被組數除盡

舉例講解參數strids

輸入一個5×5的圖像,其中的數字代表在每個像素中的顏色顯示。卷積核設置為3×3的大小。

  • strids參數的輸入格式是單個數或者形式為?(sH,sW)?的元組,可以理解成:比如輸入單個數:strids=1,每次卷積核在圖像中向上下或左右移1位;如果輸入strids=(2,3),那么每次卷積核在圖像中左右移動(橫向移動)時,是移動2位,在圖像中上下移動(縱向移動)時,是移動3位。
  • 本例設置strids=1

第一次移位:

  • 基于上述的假設,在做卷積的過程中,需要將卷積核將圖像的前三行和前三列進行匹配:

  • 在匹配過后,進行卷積計算對應位相乘然后相加,即

  • 上面的得出的10可以賦值給矩陣,然后作為一個輸出

?之后卷積核可以在圖像中進行一個移位,可以向旁邊走1位或2位,如下圖(向右走2位)。具體走多少位由strids參數決定,比如strids=2,那就是走2位。本例設置stride=1。

第二次移位:

  • 向右移動一位,進行卷積計算:

以此類推,走完整個圖像,最后輸出的矩陣如下圖。這個矩陣是卷積后的輸出

舉例講解參數padding

padding的作用是在輸入圖像的左右兩邊進行填充,padding的值決定填充的大小有多大,它的輸入形式為一個整數或者一個元組 ( padH, padW ),其中,padH=高padW=寬默認padding=0,即不進行填充。

  • 仍輸入上述的5×5的圖像,并設置padding=1,那么輸入圖像將會變成下圖,即圖像的上下左右都會拓展一個像素,然后這些空的地方像素(里面填充的數據)都默認為0。

  • 按上面的順序進行卷積計算,第一次移位時在左上角3×3的位置,卷積計算公式變為:

  • 以此類推,完成后面的卷積計算,并輸出矩陣

程序代碼
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]])input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))print(input.shape)
print(kernel.shape)output = F.conv2d(input, kernel, stride=1)
print(output)# Stride=2
output2 = F.conv2d(input, kernel, stride=2)
print(output2)#  padding=1
output3 = F.conv2d(input, kernel, stride=1, padding=1)
print(output3)

運行結果

2、torch.nn.Conv2d

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

Parameters:

  • in_channels(int) – 輸入信號的通道。輸入圖像的通道數,彩色圖像一般為3(RGB三通道)
  • out_channels(int) – 卷積產生的通道。產生的輸出的通道數
  • kerner_size(int?or?tuple) - 卷積核的尺寸。一個數或者元組,定義卷積大小。如kernel_size=3,即定義了一個大小為3×3的卷積核;kernel_size=(1,2),即定義了一個大小為1×2的卷積核。
  • stride(int?or?tuple,?optional) - 卷積步長。 默認為1,卷積核橫向、縱向的步幅大小
  • padding(int?or?tuple,?optional) - 默認為0,對圖像邊緣進行填充的范圍
  • dilation(int?or?tuple,?optional) – 卷積核元素之間的間距。默認為1,定義在卷積過程中,它的核之間的距離。這個我們稱之為空洞卷積,但不常用。
  • groups(int,?optional) – 從輸入通道到輸出通道的阻塞連接數。默認為1。分組卷積,一般都設置為1,很少有改動
  • bias(bool,?optional) - 默認為True。偏置,常年設置為True。代表卷積后的結果是否加減一個常數。

?二維卷積層, 輸入的尺度是(N, C_in,H,W),輸出尺度(N,C_out,H_out,W_out)

關于卷積操作,官方文檔的解釋如下:

圖像輸入輸出尺寸轉化計算公式

參數說明:

  • N:?圖像的batch_size

  • C:?圖像的通道數

  • H:?圖像的高

  • W:?圖像的寬

計算過程

shape:
input: (N,C_in,H_in,W_in)
output: (N,C_out,H_out,W_out)or(C_out,H_out,W_out)

看論文的時候,有些比如像padding這樣的參數不知道,就可以用這條公式去進行推導

變量:
weight(tensor) - 卷積的權重,大小是(out_channels,?in_channels,kernel_size)
bias(tensor) - 卷積的偏置系數,大小是(out_channel

參數kernel_size的說明
  • kernel_size主要是用來設置卷積核大小尺寸的,給定模型一個kernel_size,模型就可以據此生成相應尺寸的卷積核。

  • 卷積核中的參數從圖像數據分布中采樣計算得到的。

  • 卷積核中的參數會通過訓練不斷進行調整。

參數out_channel的說明
  • 如果輸入圖像in_channel=1,并且只有一個卷積核,那么對于卷積后產生的輸出,其out_channel也為1
  • 如果輸入圖像in_channel=2,此時有兩個卷積核,那么在卷積后將會輸出兩個矩陣,把這兩個矩陣當作一個輸出,此時out_channel=2
程序代碼

使用CIFAR中的圖像數據,對Conv2d進行講解

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import Dataset, DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset, batch_size=64)class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.conv1 = nn.Conv2d(3, 6, 3, stride=1, padding=0)def forward(self, x):x = self.conv1(x)return xtudui = Tudui()
print(tudui)writer = SummaryWriter('./logs')
step = 0
for data in dataloader:imgs, targets = dataoutputs = tudui(imgs)print(imgs.shape) # torch.Size([64, 3, 32, 32])print(outputs.shape) # torch.Size([64, 6, 30, 30])writer.add_images("input", imgs, step)# torch.Size([64, 6, 30, 30])   ->> [64, 3, 32, 32]output = torch.reshape(outputs, [-1, 3, 30, 30])#由于第一個值不知道是多少,所以寫-1,它會根據后面的值去計算writer.add_images("output", output, step)step += 1writer.close()

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

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

相關文章

Linux日志服務rsyslog深度解析(上)

🐇明明跟你說過:個人主頁 🏅個人專欄:《Linux :從菜鳥到飛鳥的逆襲》🏅 🔖行路有良友,便是天堂🔖 目錄 一、引言 1、日志在Linux系統中的作用 2、rsyslog歷史背景 …

保姆級講解 FTP服務器的搭建、配置與管理

本來目錄很長的 因為感覺不太美觀 所以小標題都刪掉了 本文介紹了 本地用戶的FTP服務器搭建實例匿名用戶的FTP服務器搭建實例虛擬用戶的FTP服務器搭建實例企業常見類型搭建實驗 配置與管理FTP服務器 配置與管理FTP服務器一、FTP相關知識二、項目設計與準備三、項目實施四、認識…

實驗一、網絡傳輸介質————雙絞線 《計算機網絡》

蝙蝠身上長雞毛,忘了自己是什么鳥。 目錄 一、實驗目的 二、實驗內容 1.雙絞線的原理以及分類 2.了解雙絞線的性質、結構與特性 3.掌握雙絞線的制作方法 4.了解雙絞線的材質 5.了解雙絞線的發展趨勢 三、實驗小結 一、實驗目的 1.雙絞線的原理以及分類 2.了…

MyBatisPlus——入門到進階

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。🍎個人主頁:Meteors.的博客💞當前專欄:知識分享、知識備份?特色專欄: 知識分享…

【GIS教程】土地利用轉移矩陣

隨著科技社會的不斷進步,人類活動對地理環境的影響與塑造日益明顯,土地不斷的侵蝕與改變也導致一系列的環境問題日益突出。土地利用/覆蓋(LUCC)作為全球環境變化研究的重點問題為越來越多的國際研究機構所重視,研究它的…

Day25 首頁待辦事項及備忘錄添加功能

? 本章節,完成首頁待辦事項及備忘錄添加功能 一.修改待辦事項和備忘錄邏輯處理類,即AddMemoViewModel和AddTodoViewModel 在 AddMemoViewModel邏輯處理類中,為了支持與其關聯的View視圖文件的數據綁定,需要定義一個與視圖文件相匹配的實體類 Model。這個Model將包含 View中…

圖像算法---自動對焦AF

一,CDAF反差對焦原理 CDAF,全稱Contrast Detection Auto Focus,即反差式對焦或對比度檢測自動對焦,是一種廣泛應用于入門級數碼相機和相機模塊化智能手機上的自動對焦技術。以下是關于CDAF反差對焦的詳細介紹: 工作原…

測繪航空攝影乙級資質升級為甲級的過渡期規劃

升級測繪航空攝影乙級資質為甲級通常需要一個詳細的過渡期規劃,這個過程涉及提升技術力量、積累業績、完善管理體系等多個方面。以下是一個概括性的過渡期規劃框架,具體實施時需結合實際情況和最新的資質標準進行調整: 1. 了解最新資質標準 …

每日AI資訊-20240606

智普AI推出全新開源大模型GLM-4-9B 智譜AI日前推出全新開源模型GLM-4-9B,該尺寸模型首次具備多模態能力。據了解,GLM-4-9B,最高支持1M/約兩百萬字上下文輸入,相當于2本《紅樓夢》或125篇論文的長度。性能上,GLM-4-9B函…

《手把手教你》系列練習篇之13-python+ selenium自動化測試 -壓軸篇(詳細教程)

1. 簡介 “壓軸”原本是戲曲名詞,指一場折子戲演出的倒數第二個劇目。在現代社會中有很多應用,比如“壓軸戲”,但壓軸也是人們知識的一個盲區。“壓軸”本意是指倒數第二個節目,而不是人們常說的倒數第一個,倒數第一個…

苗情生態自動監測站

TH-MQ1在現代農業發展中,苗情生態自動監測站的應用已經變得日益重要。這種技術不僅為農業生產提供了實時的數據支持,還通過精準監測和科學決策,提高了農業生產的效率和質量。 首先,苗情生態自動監測站的優勢在于其能夠實現精準監…

Java并發編程:線程與并發工具

Java并發編程:線程與并發工具 引言 在現代計算機程序中,并發編程是一個不可避免的主題。無論是提升應用程序性能,還是處理多個任務并發執行,Java為開發者提供了豐富的并發編程工具。在本篇文章中,我們將深入探討Java的并發編程,包括線程的基礎知識、線程池的使用以及常…

全流程透明雙語大語言模型MAP-Neo,4.5T 高質量數據訓練

前言 近年來,大語言模型 (LLM) 已經成為人工智能領域最熱門的研究方向之一,并在各種任務中展現出前所未有的性能。然而,由于商業利益的驅動,許多最具競爭力的模型,例如 GPT、Gemini 和 Claude,其訓練細節和…

讀書筆記-《軟件定義安全》之一:SDN和NFV:下一代網絡的變革

第1章 SDN和NFV:下一代網絡的變革 1.什么是SDN和NFV 1.1 SDN/NFV的體系結構 SDN SDN的體系結構可以分為3層: 基礎設施層由經過資源抽象的網絡設備組成,僅實現網絡轉發等數據平面的功能,不包含或僅包含有限的控制平面的功能。…

Unity Magica Cloth2 使用教程

視頻教程 參考文章 前提: 找到角色的模型 模之屋,我這里準備了轉好FBX格式的吟霖模型點擊自取【源自 模之屋】 角色舞蹈動畫 點擊下載【源自 Mixamo】 導入Unity【如何將原神的角色導入Unity】 三渲二 (必須是2022.3LTS和URP項目) Magica Cloth2 頭…

深入探索Stage #13:CSS層疊樣式表的IE特性偽協議注入

在網絡安全領域,跨站腳本攻擊(XSS)是一種常見的攻擊手段。隨著Web技術的不斷發展,攻擊者也在不斷探索新的攻擊途徑。本文將詳細介紹如何利用IE瀏覽器的特性,通過CSS層疊樣式表進行XSS攻擊。 實驗環境搭建 為了模擬IE…

spring boot 白盒測試實戰

假設項目中存在以下代碼: 常量類:public final static String NUMBER_REGEX "\\d"; service:return ReUtil.getGroup0(Constants.NUMBER_REGEX, waybill); 代碼解析 解釋: return ReUtil.getGroup0(Constants.NUMB…

python學習 - 使用OpenCV庫(cv2)和imutils庫實現輔助答題卡判別

測試數據見文章頂部位置資源!!! 使用了OpenCV庫(cv2)和imutils庫。代碼的主要目的是處理圖像中的問題,如識別圖像中的文字,并對其進行分析和排序。 輔助答題卡判別 # -*- coding:utf-8 -*- fr…

python實現郵箱轟炸機

最近在學計算機網絡看到套接字的練習 于是應用SMTP協議寫了個發送郵箱的玩玩 可以發一大堆垃圾郵件給對方 其中參考了 關于發郵件報錯535 Error:authentication failed解決方法http://t.csdnimg.cn/Bc0Dq 已經查詢如何獲取網易郵箱客戶端授權碼 base64編碼 i…

Mybatis05-一對多和多對一處理

多對一和一對多 多對一 多對一的理解: 多個學生對應一個老師 如果對于學生這邊,就是一個多對一的現象,即從學生這邊關聯一個老師! 結果映射(resultMap): association 一個復雜類型的關聯&…