轉置卷積解釋與示例計算

文章目錄

  • 轉置卷積的三種等價實現方法:原理、公式與等價性分析
    • 數學定義與核心公式
    • 方法一:零填充+翻轉核卷積(數學定義方法)
      • 原理與公式
      • 等價性說明
    • 方法二:直接位置映射(pytorch框架高效實現)
      • 原理與公式
      • 等價性說明
    • 方法三:矩陣轉置法(數學本質實現)
      • 原理與公式
      • 等價性說明
  • 轉置卷積三種方法詳細計算過程(使用輸入X和卷積核K)
    • 輸入參數
    • 方法一:零填充+翻轉核卷積(數學定義方法)
      • 計算步驟:
    • 方法二:直接位置映射(框架高效實現)
      • 計算步驟:
    • 方法三:矩陣轉置法(數學本質實現)
      • 計算步驟:
    • 三種方法統一結果
    • code

轉置卷積的三種等價實現方法:原理、公式與等價性分析

數學定義與核心公式

轉置卷積的數學本質是卷積運算的伴隨算子(adjoint operator)。給定輸入 X∈RHin×WinX \in \mathbb{R}^{H_{in} \times W_{in}}XRHin?×Win? 和卷積核 K∈RHk×WkK \in \mathbb{R}^{H_k \times W_k}KRHk?×Wk?,輸出 Y∈RHout×WoutY \in \mathbb{R}^{H_{out} \times W_{out}}YRHout?×Wout? 滿足:

Hout=(Hin?1)×stride+Hk?2×paddingH_{out} = (H_{in} - 1) \times \text{stride} + H_k - 2 \times \text{padding}Hout?=(Hin??1)×stride+Hk??2×padding
Wout=(Win?1)×stride+Wk?2×paddingW_{out} = (W_{in} - 1) \times \text{stride} + W_k - 2 \times \text{padding}Wout?=(Win??1)×stride+Wk??2×padding

三種方法都實現了相同的線性變換:
Y=T(X;K,stride,padding)Y = \mathcal{T}(X; K, \text{stride}, \text{padding})Y=T(X;K,stride,padding)

其中 T\mathcal{T}T 表示轉置卷積操作。

方法一:零填充+翻轉核卷積(數學定義方法)

原理與公式

  1. 輸入擴展
    Xexpanded[i,j×s]=X[i,j]X_{\text{expanded}}[i, j \times s] = X[i, j]Xexpanded?[i,j×s]=X[i,j]
    其中 sss 為步長,元素間插入 (s?1)(s-1)(s?1) 個零值

  2. 邊界填充
    Xpadded=pad(Xexpanded,p)X_{\text{padded}} = \text{pad}(X_{\text{expanded}}, p)Xpadded?=pad(Xexpanded?,p)
    p=max?(padding,k?1)p = \max(\text{padding}, k-1)p=max(padding,k?1)

  3. 核翻轉
    Kflipped[i,j]=K[Hk?1?i,Wk?1?j]K_{\text{flipped}}[i,j] = K[H_k-1-i, W_k-1-j]Kflipped?[i,j]=K[Hk??1?i,Wk??1?j]

  4. 互相關運算
    Y[m,n]=∑i=0Hk?1∑j=0Wk?1Xpadded[m+i,n+j]?Kflipped[i,j]Y[m,n] = \sum_{i=0}^{H_k-1} \sum_{j=0}^{W_k-1} X_{\text{padded}}[m+i, n+j] \cdot K_{\text{flipped}}[i,j]Y[m,n]=i=0Hk??1?j=0Wk??1?Xpadded?[m+i,n+j]?Kflipped?[i,j]

等價性說明

此方法直接實現數學定義:轉置卷積 = 翻轉核 + 擴展輸入 + 互相關

方法二:直接位置映射(pytorch框架高效實現)

原理與公式

  1. 位置映射
    For?each?(i,j)∈X:\text{For each } (i,j) \in X:For?each?(i,j)X:
    Y[i?s+k,j?s+l]+=X[i,j]?K[k,l]Y[i \cdot s + k, j \cdot s + l] \mathrel{+}= X[i,j] \cdot K[k,l]Y[i?s+k,j?s+l]+=X[i,j]?K[k,l]
    k∈[0,Hk?1],l∈[0,Wk?1]k \in [0, H_k-1], l \in [0, W_k-1]k[0,Hk??1],l[0,Wk??1]

  2. 邊界處理
    僅當 i?s+k?p≥0i \cdot s + k - p \geq 0i?s+k?p0j?s+l?p<Woutj \cdot s + l - p < W_{out}j?s+l?p<Wout? 時累加

等價性說明

此方法通過散射(scatter)操作實現:

  • 每個輸入元素將核權重"放置"到輸出空間
  • 重疊區域的值自動累加
  • 數學上等價于方法一,但避免了顯式擴展

方法三:矩陣轉置法(數學本質實現)

原理與公式

  1. 構建卷積矩陣
    定義常規卷積算子 CCC,滿足:
    vec(Yconv)=C?vec(X)\text{vec}(Y_{\text{conv}}) = C \cdot \text{vec}(X)vec(Yconv?)=C?vec(X)

  2. 轉置卷積
    vec(Y)=CT?vec(X)\text{vec}(Y) = C^T \cdot \text{vec}(X)vec(Y)=CT?vec(X)

  3. 矩陣元素
    C(m,n),(i,j)=K[k,l]if{i=?m/s?+kj=?n/s?+lC_{(m,n),(i,j)} = K[k,l] \quad \text{if} \quad \begin{cases} i = \lfloor m/s \rfloor + k \\ j = \lfloor n/s \rfloor + l \end{cases}C(m,n),(i,j)?=K[k,l]if{i=?m/s?+kj=?n/s?+l?

等價性說明

此方法直接實現線性代數的伴隨算子定義:

  • CCC 是卷積的矩陣表示
  • CTC^TCT 是轉置卷積的精確數學實現

轉置卷積三種方法詳細計算過程(使用輸入X和卷積核K)

輸入參數

  • 輸入矩陣 X
    [[1, 2],[3, 4]]
    
  • 卷積核 K
    [[5, 6],[7, 8]]
    
  • 步長 stride:2
  • 填充 padding:0
  • 輸出尺寸:4×4(根據公式:(2-1)×2 + 2 - 0 = 4

方法一:零填充+翻轉核卷積(數學定義方法)

計算步驟:

  1. 輸入矩陣 X零填充擴展輸入

    • 在元素間插入 (stride-1)=1 個零值
    • 在行間插入 (stride-1)=1 行零行
    [[1, 0, 2],[0, 0, 0],[3, 0, 4]]
    
  2. 輸入矩陣 X邊界填充

    • 添加 (kernel_size-p-1)=1 圈零值
    [[0, 0, 0, 0, 0],[0, 1, 0, 2, 0],[0, 0, 0, 0, 0],[0, 3, 0, 4, 0],[0, 0, 0, 0, 0]]
    
  3. 核翻轉

    • 180度旋轉卷積核
    原始核:[[5, 6],[7, 8]]翻轉核:[[8, 7],[6, 5]]
    
  4. 互相關計算

    • 使用翻轉后的核在填充矩陣上滑動計算
    • 位置(0,0)
      窗口:[[0,0],[0,1]]
      計算:0×8 + 0×7 + 0×6 + 1×5 = 5
      
    • 位置(0,1)
      窗口:[[0,0],[1,0]]
      計算:0×8 + 0×7 + 1×6 + 0×5 = 6
      
    • 位置(0,2)
      窗口:[[0,0],[0,2]]
      計算:0×8 + 0×7 + 0×6 + 2×5 = 10
      
    • 位置(0,3)
      窗口:[[0,0],[2,0]]
      計算:0×8 + 0×7 + 2×6 + 0×5 = 12
      
    • 位置(1,0)
      窗口:[[0,1],[0,0]]
      計算:0×8 + 1×7 + 0×6 + 0×5 = 7
      
    • 位置(1,1)
      窗口:[[1,0],[0,0]]
      計算:1×8 + 0×7 + 0×6 + 0×5 = 8
      
    • 位置(1,2)
      窗口:[[0,2],[0,0]]
      計算:0×8 + 2×7 + 0×6 + 0×5 = 14
      
    • 位置(1,3)
      窗口:[[2,0],[0,0]]
      計算:2×8 + 0×7 + 0×6 + 0×5 = 16
      
    • 位置(2,0)
      窗口:[[0,0],[0,3]]
      計算:0×8 + 0×7 + 0×6 + 3×5 = 15
      
    • 位置(2,1)
      窗口:[[0,0],[3,0]]
      計算:0×8 + 0×7 + 3×6 + 0×5 = 18
      
    • 位置(2,2)
      窗口:[[0,0],[0,4]]
      計算:0×8 + 0×7 + 0×6 + 4×5 = 20
      
    • 位置(2,3)
      窗口:[[0,0],[4,0]]
      計算:0×8 + 0×7 + 4×6 + 0×5 = 24
      
    • 位置(3,0)
      窗口:[[0,3],[0,0]]
      計算:0×8 + 3×7 + 0×6 + 0×5 = 21
      
    • 位置(3,1)
      窗口:[[3,0],[0,0]]
      計算:3×8 + 0×7 + 0×6 + 0×5 = 24
      
    • 位置(3,2)
      窗口:[[0,4],[0,0]]
      計算:0×8 + 4×7 + 0×6 + 0×5 = 28
      
    • 位置(3,3)
      窗口:[[4,0],[0,0]]
      計算:4×8 + 0×7 + 0×6 + 0×5 = 32
      
  5. 最終輸出

    [[ 5,  6, 10, 12],[ 7,  8, 14, 16],[15, 18, 20, 24],[21, 24, 28, 32]]
    

方法二:直接位置映射(框架高效實現)

計算步驟:

  1. 位置映射關系

    • 輸入元素位置 → 輸出起始位置
    (0,0) → (0,0)
    (0,1) → (0,2)
    (1,0) → (2,0)
    (1,1) → (2,2)
    
  2. 核權重分配

    • 元素(0,0)=1 的貢獻:
      [1×5, 1×6] → 位置(0,0)和(0,1)
      [1×7, 1×8] → 位置(1,0)和(1,1)
      
    • 元素(0,1)=2 的貢獻:
      [2×5, 2×6] → 位置(0,2)和(0,3)
      [2×7, 2×8] → 位置(1,2)和(1,3)
      
    • 元素(1,0)=3 的貢獻:
      [3×5, 3×6] → 位置(2,0)和(2,1)
      [3×7, 3×8] → 位置(3,0)和(3,1)
      
    • 元素(1,1)=4 的貢獻:
      [4×5, 4×6] → 位置(2,2)和(2,3)
      [4×7, 4×8] → 位置(3,2)和(3,3)
      
  3. 輸出矩陣構建

    (0,0): 1×5 = 5
    (0,1): 1×6 = 6
    (0,2): 2×5 = 10
    (0,3): 2×6 = 12(1,0): 1×7 = 7
    (1,1): 1×8 = 8
    (1,2): 2×7 = 14
    (1,3): 2×8 = 16(2,0): 3×5 = 15
    (2,1): 3×6 = 18
    (2,2): 4×5 = 20
    (2,3): 4×6 = 24(3,0): 3×7 = 21
    (3,1): 3×8 = 24
    (3,2): 4×7 = 28
    (3,3): 4×8 = 32
    
  4. 完整輸出

    [[ 5,  6, 10, 12],[ 7,  8, 14, 16],[15, 18, 20, 24],[21, 24, 28, 32]]
    

方法三:矩陣轉置法(數學本質實現)

計算步驟:

  1. 構建卷積矩陣 C

    • 常規卷積:從4×4輸入 → 2×2輸出
    • 矩陣維度:4行(輸出元素) × 16列(輸入元素)
  2. 填充卷積矩陣

    • 輸出位置(0,0)對應輸入位置:
      [0,0]:5, [0,1]:6
      [1,0]:7, [1,1]:8
      
    • 矩陣行(0,0):[5,6,0,0,7,8,0,0,0,0,0,0,0,0,0,0]
    • 輸出位置(0,1)對應輸入位置:
      [0,2]:5, [0,3]:6
      [1,2]:7, [1,3]:8
      
    • 矩陣行(0,1):[0,0,5,6,0,0,7,8,0,0,0,0,0,0,0,0]
    • 輸出位置(1,0)對應輸入位置:
      [2,0]:5, [2,1]:6
      [3,0]:7, [3,1]:8
      
    • 矩陣行(1,0):[0,0,0,0,0,0,0,0,5,6,0,0,7,8,0,0]
    • 輸出位置(1,1)對應輸入位置:
      [2,2]:5, [2,3]:6
      [3,2]:7, [3,3]:8
      
    • 矩陣行(1,1):[0,0,0,0,0,0,0,0,0,0,5,6,0,0,7,8]
  3. 轉置矩陣 CTC^TCT

    • 尺寸:16×4
    • 每列對應一個輸出位置的影響
  4. 矩陣乘法

    • 輸入展平:[1,2,3,4]
    • 計算:Y_flat = C^T × [1,2,3,4]^T
    • 結果:
      [5,6,10,12,7,8,14,16,15,18,20,24,21,24,28,32]
      
  5. 重塑為4×4矩陣

    [[ 5,  6, 10, 12],[ 7,  8, 14, 16],[15, 18, 20, 24],[21, 24, 28, 32]]
    

三種方法統一結果

[[ 5,  6, 10, 12],[ 7,  8, 14, 16],[15, 18, 20, 24],[21, 24, 28, 32]]

code

import torch
import torch.nn as nn# 定義輸入張量和卷積核
input_tensor = torch.tensor([[[[1, 2],[3, 4]]]], dtype=torch.float32)  # 形狀(1,1,2,2)
kernel = torch.tensor([[[[5, 6],[7, 8]]]], dtype=torch.float32)       # 形狀(1,1,2,2)# 方法1:使用nn.ConvTranspose2d模塊(推薦)
def method_conv_transpose2d(input, kernel):# 創建轉置卷積層conv_trans = nn.ConvTranspose2d(in_channels=1,      # 輸入通道數out_channels=1,     # 輸出通道數kernel_size=2,      # 卷積核尺寸stride=2,           # 步長padding=0,          # 輸入填充bias=False          # 禁用偏置)# 手動注入卷積核權重with torch.no_grad():conv_trans.weight = nn.Parameter(kernel)# 執行計算return conv_trans(input)# 方法2:使用functional.conv_transpose2d函數
def method_functional(input, kernel):return torch.nn.functional.conv_transpose2d(input=input,weight=kernel,bias=None,stride=2,padding=0)# 方法3:手動實現轉置卷積(驗證原理)
def manual_transposed_conv(input, kernel):"""根據和的數學原理實現:1. 輸入插值:步長2需插入1行/列零2. 外部填充:卷積核2x2需在邊緣補1圈零3. 用旋轉180°的核執行普通卷積(步長1)"""# 輸入插值(插入行列零)interpolated = torch.zeros(1, 1, 3, 3)interpolated[0, 0, ::2, ::2] = input.squeeze()# 外部填充(四周各補1圈零)padded = torch.nn.functional.pad(interpolated, [1, 1, 1, 1])# 卷積核旋轉180°rotated_kernel = torch.rot90(kernel.squeeze(), 2, dims=(0, 1)).unsqueeze(0).unsqueeze(0)print("旋轉后的卷積核:\n", rotated_kernel.squeeze())# 執行普通卷積(步長1,無填充)return torch.nn.functional.conv2d(padded, rotated_kernel, padding=0)# 計算并驗證結果
output_module = method_conv_transpose2d(input_tensor, kernel)
output_functional = method_functional(input_tensor, kernel)
output_manual = manual_transposed_conv(input_tensor, kernel)print("nn.ConvTranspose2d 輸出:\n", output_module.squeeze())
print("F.conv_transpose2d 輸出:\n", output_functional.squeeze())
print("手動實現轉置卷積輸出:\n", output_manual.squeeze())

結果:

旋轉后的卷積核:tensor([[8., 7.],[6., 5.]])
nn.ConvTranspose2d 輸出:tensor([[ 5.,  6., 10., 12.],[ 7.,  8., 14., 16.],[15., 18., 20., 24.],[21., 24., 28., 32.]], grad_fn=<SqueezeBackward0>)
F.conv_transpose2d 輸出:tensor([[ 5.,  6., 10., 12.],[ 7.,  8., 14., 16.],[15., 18., 20., 24.],[21., 24., 28., 32.]])
手動實現轉置卷積輸出:tensor([[ 5.,  6., 10., 12.],[ 7.,  8., 14., 16.],[15., 18., 20., 24.],[21., 24., 28., 32.]])

參考:
00
0
1
2
3

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

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

相關文章

關于車位引導及汽車乘梯解決方案的專業性、系統性、可落地性強的綜合設計方案與技術實現說明,旨在為現代智慧停車樓提供高效、安全、智能的停車體驗。

一、系統概述隨著城市土地資源日益緊張&#xff0c;立體停車、自動化停車成為發展趨勢。本方案圍繞“車位引導系統 汽車乘梯系統”構建智慧停車核心體系&#xff0c;結合地磁/視頻/超聲波檢測、AI識別、語音交互、電梯自動調度等先進技術&#xff0c;實現車輛入場、引導、停泊…

【相機】曝光時間長-->拖影

曝光時間長 → 運動目標在快門開啟期間持續移動 → 同一像素記錄多個位置的能量 → 圖像出現“拖影”&#xff08;運動模糊&#xff09;。&#x1f50d; 具體原因卷簾快門&#xff08;Rolling Shutter&#xff09;效應 RealSense 的 RGB 傳感器&#xff08;如 IMX 系列&#xf…

day36 力扣1049.最后一塊石頭的重量II 力扣494.目標和 力扣474.一和零

最后一塊石頭的重量II有一堆石頭&#xff0c;用整數數組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。每一回合&#xff0c;從中選出任意兩塊石頭&#xff0c;然后將它們一起粉碎。假設石頭的重量分別為 x 和 y&#xff0c;且 x < y。那么粉碎的可能結果如下&#…

Java內存模型(Java Memory Model,JMM)

?? JMM?? 是Java虛擬機&#xff08;JVM&#xff09;規范中定義的一組規則和規范&#xff0c;用于描述多線程環境下&#xff0c;Java程序中變量的訪問和修改行為&#xff0c;尤其是在并發編程中如何保證內存可見性、原子性和有序性。JMM 是 Java 并發編程的基石&…

【swoole Windows 開發(swoole-cli 開發 hyperf)】

先前swoole在Windows平臺的開發體驗極差&#xff0c;如果在Windows開發swoole的東西可以用docker或者虛擬機&#xff0c;遠程開發&#xff0c;體驗比較好的是直接Mac或者Linux系統開發。但是作為window平臺的釘子戶表示我窮。swoole之前已經推出了cygwin64編譯成winwods版本的方…

興達餐飲 酒店 進銷存管理系統軟件

興達餐飲 酒店 進銷存管理系統軟件

Seal Report:一款免費開源的報表工具

Seal Report 是一款基于 C# 語言開發的開源報表工具&#xff0c;可以從各種數據庫或 NoSQL 數據源中生成日常報告&#xff0c;并且執行復雜的計劃任務。 功能特性 免費開源&#xff1a;源代碼托管在 GitHub 上&#xff0c;用戶可以自由使用、修改、甚至集成到自己的系統中&…

WebRTC 多媒體 SDP 示例與解析

webRTC中的SDP的Bundlle可能包含一個或者多個媒體塊&#xff08;媒體描述, 源碼對應類ContentInfo&#xff09;&#xff0c;從 m 開始到下一個 m 行&#xff08;或 SDP 結束&#xff09;之間的所有屬性&#xff08;包括 a&#xff09;都屬于同一個媒體塊&#xff08;media sect…

SpringBoot 啟動富文本文字更改

正常來說 SpringBoot啟動時候&#xff0c;展示的文字是這個 、 主播這邊想要換一個樣式&#xff0c;換一個自己自定義的文字 這邊換成了自己的博客名字 具體實現操作如下 在項目目錄 resources下創建一個名字為banner.txt的文本&#xff0c;這是SpringBoot啟動的時候尋找的…

基于結構熵權-云模型的鑄鐵浴缸生產工藝安全評價

一、評價模型核心思想 結構熵權法 解決傳統熵權法忽略指標間結構關系的問題,通過指標層次網絡計算權重。 步驟: 構建工藝安全評價指標體系(樹狀/網絡結構) 計算同級指標間的影響度矩陣 引入修正熵權:wj=1?Ej∑(1?Ek)結構影響因子w_j = \frac{1 - E_j}{\sum (1 - E_k)} \…

[Linux]從零開始的vs code交叉調試arm Linux程序教程

一、前言 最近的項目中需要集成rknn的視覺識別&#xff0c;在這之前我并且沒有將rknn集成到自己項目的經驗。這里我需要在rknn原本demo的基礎上我還需要集成自己的業務代碼。但是又有一個問題&#xff0c;原本rknn我們都是使用交叉編譯編譯到開發板上的&#xff0c;并且我們還要…

視頻號私信自動化回復插件

給自己的瀏覽器插件又增加了視頻號斯信的自動化回復搜索&#xff1a;程序員老狼主體邏輯就是&#xff0c;不停的點擊打招呼和斯信那個tab切換查看有無小紅點&#xff0c;有小紅點的會話&#xff0c;就點擊。查看有無打招呼&#xff0c;有打招呼就點擊&#xff0c;抓取昵稱和內容…

Web前端實現銀河粒子流動特效的3種技術方案對比與實踐

文章目錄 前端實現銀河粒子流動特效的技術原理與實踐 引言:銀河粒子特效的技術背景與現狀 技術發展歷史 當前技術現狀 技術原理與實現方案 思維導圖:銀河粒子特效技術架構 1. CSS3實現方案 基礎實現代碼 性能優化技巧 2. Canvas 2D實現方案 基礎實現代碼 Canvas高級優化技術 …

Linux:告別Jammy,擁抱Noble!WSL Ubuntu 22.04 到 24.04 LTS 終極升級指南

大家好&#xff01;如果大家和我一樣&#xff0c;是Windows Subsystem for Linux (WSL) 的忠實用戶&#xff0c;那么大家一定對Ubuntu在其中的表現印象深刻。我們中的許多人可能還在使用穩定可靠的Ubuntu 22.04 LTS (Jammy Jellyfish)。但現在&#xff0c;一個更令人興奮的時代…

江協科技STM32 11-1 SPI通信協議

本節課我們將繼續學習下一個通信協議&#xff0c;SPI。SPI通信和我們剛剛學習過的I2C通信差不多。兩個協議的設計目的都一樣都是實現主控芯片和各種外掛芯片之間的數據交流&#xff0c;有了數據交流的能力&#xff0c;我們的主控芯片就可以掛載并操縱各式各樣的外部芯片&#x…

預過濾環境光貼圖制作教程:第一步 - HDR 轉立方體貼圖

在基于物理的渲染(PBR)中,環境光貼圖是實現真實光照效果的核心組件之一。而將 HDR 全景圖轉換為立方體貼圖,是制作預過濾環境光貼圖的基礎步驟。本教程將詳細講解如何實現這一轉換過程。 什么是 HDR 轉立方體貼圖? HDR(高動態范圍)全景圖通常以等矩形投影(Equirectan…

02 深度學習介紹【動手學深度學習v2】| 學習筆記

1、intro自然語言處理雖然我們過去取得了很大的進展&#xff0c;但是實際上還是停留在感知層面。計算機視覺領域&#xff0c;因為圖片里面都是像素&#xff0c;像素很難用符號學來解釋&#xff0c;所以計算機視覺大部分是用概率模型或機器學習來做。深度學習它是機器學習的一種…

智能學號抽取系統V5.6.4重磅發布

告別隨機數&#xff0c;擁抱智能點名&#xff01;—— 全新升級的“智能學號抽取系統V5.6.4”重磅發布&#xff01; 摘要&#xff1a; 還在為課堂隨機提問、活動抽獎而手動翻名單、查表格而煩惱嗎&#xff1f;還在忍受傳統點名工具的簡陋和不智能嗎&#xff1f;今天&#xff0…

Leetcode-141.環形鏈表

dict和set 1. 結構上的區別&#xff1a;類型鍵&#xff08;Key&#xff09;值&#xff08;Value&#xff09;示例dict有有{a: 1, b: 2}set有沒有{a, b} dict 是**鍵值對&#xff08;key-value&#xff09;**的集合。set 是只有鍵&#xff08;key&#xff09;沒有值的一組唯一元…

調節步進電機速度時調PSC和調ARR的區別

在步進電機控制中&#xff0c;調節速度通常是通過改變脈沖頻率實現的。代碼中選擇調節ARR&#xff08;Auto-Reload Register&#xff09;而非PSC&#xff08;Prescaler&#xff09;的原因如下&#xff1a; 1. ARR 與 PSC 的核心區別 ? ARR&#xff08;自動重載寄存器&#xff…