Python训练营---DAY48

DAY 48 随机函数与广播机制

知识点回顾:

  1. 随机张量的生成:torch.randn函数
  2. 卷积和池化的计算公式(可以不掌握,会自动计算的)
  3. pytorch的广播机制:加法和乘法的广播机制

ps:numpy运算也有类似的广播机制,基本一致

作业:自己多借助ai举几个例子帮助自己理解即可

1、随机张量的生成:torch.randn函数

# 生成3维张量(常用于图像数据的通道、高度、宽度)
tensor_3d = torch.randn(3, 224, 224)  # 3通道,高224,宽224
print(f"3维张量形状: {tensor_3d.shape}")  # 输出: torch.Size([3, 224, 224])
# 生成4维张量(常用于批量图像数据:[batch, channel, height, width])
tensor_4d = torch.randn(2, 3, 224, 224)  # 批量大小为2,3通道,高224,宽224
print(f"4维张量形状: {tensor_4d.shape}")  # 输出: torch.Size([2, 3, 224, 224])

torch.rand():生成[0,1)范围内均匀分布的随机数

x = torch.rand(3, 2)  # 生成3x2的张量
print(f"均匀分布随机数: {x}, 形状: {x.shape}")

torch.randint():生成指定范围内的随机整数

x = torch.randint(low=0, high=10, size=(3,))  # 生成3个0到9之间的整数
print(f"随机整数: {x}, 形状: {x.shape}")

torch.normal():生成指定均值和标准差的正态分布随机数。

mean = torch.tensor([0.0, 0.0])
std = torch.tensor([1.0, 2.0])
x = torch.normal(mean, std)  # 生成两个正态分布随机数
print(f"正态分布随机数: {x}, 形状: {x.shape}")

2、卷积和池化的计算公式(可以不掌握,会自动计算的)

3、pytorch的广播机制:加法和乘法的广播机制

案例 1:张量 a(3, 1) 与张量 b(3,)
  • 步骤 1:补全维度
    张量的形状可以理解为 “维度的元组”,为了对齐,先给维度少的张量补 1(在最左侧补) 。这里 b 原本是 (3,)(1 维),补全后变成 (1, 3)(2 维),和 a 的维度数(2 维)对齐。
  • 步骤 2:逐维扩展
    对每个维度,若其中一个张量该维度大小为 1,就复制数据扩展到另一张量的维度大小 。a 形状是 (3, 1)b 补全后是 (1, 3)
    • 第 1 维(行方向):a 是 3b 是 1 → b 第 1 维扩展为 3(复制自身 3 次)。
    • 第 2 维(列方向):a 是 1b 是 3 → a 第 2 维扩展为 3(复制自身 3 次)。
      最终两者都扩展为 (3, 3),就能逐元素运算。
案例 2:张量 a(5, 1, 4) 与张量 b(1, 3, 1)
  • 直接对比每个维度(从右往左):
    • 第 3 维(最右侧):a 是 4b 是 1 → 兼容(1 可扩展)。
    • 第 2 维:a 是 1b 是 3 → 兼容(1 可扩展)。
    • 第 1 维:a 是 5b 是 1 → 兼容(1 可扩展)。
  • 扩展后,每个维度取较大值 :第 1 维 5、第 2 维 3、第 3 维 4,最终形状 (5, 3, 4) ,满足广播。
案例 3:张量 a(2, 1, 3, 4) 与张量 b(5, 1, 4)
  • 步骤 1:补全维度
    b 是 3 维,a 是 4 维 → 给 b 最左侧补 1,变成 (1, 5, 1, 4) ,和 a 维度数(4 维)对齐。
  • 步骤 2:逐维扩展
    对比每个维度(从右往左):
    • 第 4 维:a 是 4b 是 4 → 相等,无需扩展。
    • 第 3 维:a 是 3b 是 1 → b 第 3 维扩展为 3(复制)。
    • 第 2 维:a 是 1b 是 5 → a 第 2 维扩展为 5(复制)。
    • 第 1 维:a 是 2b 是 1 → b 第 1 维扩展为 2(复制)。
      最终形状 (2, 5, 3, 4) ,完成广播。
3.1加法的广播机制

二维+一维

import torch# 创建原始张量
a = torch.tensor([[10], [20], [30]])  # 形状: (3, 1)
b = torch.tensor([1, 2, 3])          # 形状: (3,)result = a + b
# 广播过程
# 1. b补全维度: (3,) → (1, 3)
# 2. a扩展列: (3, 1) → (3, 3)
# 3. b扩展行: (1, 3) → (3, 3)
# 最终形状: (3, 3)print("原始张量a:")
print(a)print("\n原始张量b:")
print(b)print("\n广播后a的值扩展:")
print(torch.tensor([[10, 10, 10],[20, 20, 20],[30, 30, 30]]))  # 实际内存中未复制,仅逻辑上扩展print("\n广播后b的值扩展:")
print(torch.tensor([[1, 2, 3],[1, 2, 3],[1, 2, 3]]))  # 实际内存中未复制,仅逻辑上扩展print("\n加法结果:")
print(result)

三维+二维

# 创建原始张量
a = torch.tensor([[[1], [2]], [[3], [4]]])  # 形状: (2, 2, 1)
b = torch.tensor([[10, 20]])               # 形状: (1, 2)# 广播过程
# 1. b补全维度: (1, 2) → (1, 1, 2)
# 2. a扩展第三维: (2, 2, 1) → (2, 2, 2)
# 3. b扩展第一维: (1, 1, 2) → (2, 1, 2)
# 4. b扩展第二维: (2, 1, 2) → (2, 2, 2)
# 最终形状: (2, 2, 2)result = a + b
print("原始张量a:")
print(a)print("\n原始张量b:")
print(b)print("\n广播后a的值扩展:")
print(torch.tensor([[[1, 1],[2, 2]],[[3, 3],[4, 4]]]))  # 实际内存中未复制,仅逻辑上扩展print("\n广播后b的值扩展:")
print(torch.tensor([[[10, 20],[10, 20]],[[10, 20],[10, 20]]]))  # 实际内存中未复制,仅逻辑上扩展print("\n加法结果:")
print(result)

二维+标量

# 创建原始张量
a = torch.tensor([[1, 2], [3, 4]])  # 形状: (2, 2)
b = 10                              # 标量,形状视为 ()# 广播过程
# 1. b补全维度: () → (1, 1)
# 2. b扩展第一维: (1, 1) → (2, 1)
# 3. b扩展第二维: (2, 1) → (2, 2)
# 最终形状: (2, 2)result = a + b
print("原始张量a:")
print(a)
# 输出:
# tensor([[1, 2],
#         [3, 4]])print("\n标量b:")
print(b)
# 输出: 10print("\n广播后b的值扩展:")
print(torch.tensor([[10, 10],[10, 10]]))  # 实际内存中未复制,仅逻辑上扩展print("\n加法结果:")
print(result)
# 输出:
# tensor([[11, 12],
#         [13, 14]])

3.2乘法的广播机制

批量矩阵与单个矩阵相乘

import torch# A: 批量大小为2,每个是3×4的矩阵
A = torch.randn(2, 3, 4)  # 形状: (2, 3, 4)# B: 单个4×5的矩阵
B = torch.randn(4, 5)     # 形状: (4, 5)# 广播过程:
# 1. B补全维度: (4, 5) → (1, 4, 5)
# 2. B扩展第一维: (1, 4, 5) → (2, 4, 5)
# 矩阵乘法: (2, 3, 4) @ (2, 4, 5) → (2, 3, 5)
result = A @ B            # 结果形状: (2, 3, 5)print("A形状:", A.shape)  # 输出: torch.Size([2, 3, 4])
print("B形状:", B.shape)  # 输出: torch.Size([4, 5])
print("结果形状:", result.shape)  # 输出: torch.Size([2, 3, 5])

批量矩阵与批量矩阵相乘(部分广播)

# A: 批量大小为3,每个是2×4的矩阵
A = torch.randn(3, 2, 4)  # 形状: (3, 2, 4)# B: 批量大小为1,每个是4×5的矩阵
B = torch.randn(1, 4, 5)  # 形状: (1, 4, 5)# 广播过程:
# B扩展第一维: (1, 4, 5) → (3, 4, 5)
# 矩阵乘法: (3, 2, 4) @ (3, 4, 5) → (3, 2, 5)
result = A @ B            # 结果形状: (3, 2, 5)print("A形状:", A.shape)  # 输出: torch.Size([3, 2, 4])
print("B形状:", B.shape)  # 输出: torch.Size([1, 4, 5])
print("结果形状:", result.shape)  # 输出: torch.Size([3, 2, 5])

三维张量与二维张量相乘(高维广播)

# A: 批量大小为2,通道数为3,每个是4×5的矩阵
A = torch.randn(2, 3, 4, 5)  # 形状: (2, 3, 4, 5)# B: 单个5×6的矩阵
B = torch.randn(5, 6)        # 形状: (5, 6)# 广播过程:
# 1. B补全维度: (5, 6) → (1, 1, 5, 6)
# 2. B扩展第一维: (1, 1, 5, 6) → (2, 1, 5, 6)
# 3. B扩展第二维: (2, 1, 5, 6) → (2, 3, 5, 6)
# 矩阵乘法: (2, 3, 4, 5) @ (2, 3, 5, 6) → (2, 3, 4, 6)
result = A @ B               # 结果形状: (2, 3, 4, 6)print("A形状:", A.shape)     # 输出: torch.Size([2, 3, 4, 5])
print("B形状:", B.shape)     # 输出: torch.Size([5, 6])
print("结果形状:", result.shape)  # 输出: torch.Size([2, 3, 4, 6])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是ANSYS ACT? ACT又可以分为哪几类?

ANSYS作为目前仿真界主流软件之一,除了给用户提供其强大的功能之外,还给用户提供了高度自定义定制的权限。所谓定制,也即用户可以根据自己仿真需求修改现有功能并展示全新功能的产品内操作。定制的目标是改变现有的用户体验,以满足…

电路图识图基础知识-电动机正反转控制电路详解(二十)

1. 转换开关手动正反转控制电路 转换开关(QS)又称倒顺开关,是一种手动控制装置,可切换电动机的旋转方向。它具有三个工作位置:正向、停止和反向。 工作原理: 闭合总电源开关 QS若需正向运转,将…

Spring Boot微服务架构(十):Docker与K8S部署的区别

Spring Boot微服务在Docker与Kubernetes(K8S)中的部署存在显著差异,主要体现在技术定位、管理能力、扩展性及适用场景等方面。以下是两者的核心区别及实践对比: 一、技术定位与核心功能 Docker 功能:专注于单节点容器化…

性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断

🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断 📚 目录 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断一、为什么选择 MiniProfiler? 🧐二、集成 MiniProf…

ESP32 在Arduino开发环境中,如果程序运行报错如何定位程序报错是哪行代码

在开发中,我们常常会遇到编译正常,但是运行过程中程序报错,然后重启,在这种情况下,又没法知道是哪段程序引起的,现在我们就来解决这个问题。 其实ESP32的SDK中已经附带这些debug的工具了。 首先如果我们程…

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…

win10启动时小键盘灯默认不亮怎么办

第一步,按winR,打开运行。 第二步,输入regedit,打开注册表。 第三步,在注册表编辑器中,依次展开HKEY_ USERS --》.DEFAULT --》Control Panel --》Keyboard , 第四步,选中Keyboard 之后在右侧窗…

C盘的“下载”修改位置时出错了,怎么还原

本来想修改“下载”的位置,结果直接成D盘的快捷键了。 正常应该是D盘里面的一个文件夹,而不是D盘。 而且打开D盘,里面的文件夹,全部按照时间分区显示了,而不是正常的文件显示。 解决办法: 1、还原下载路…

量化面试绿皮书:7. 100的阶乘中有多少个尾随零

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。 7. 100的阶乘中有多少个尾随零 Q: 100 ! 100! 100!(100 的阶乘)中有多少个尾随零? A: 100 ! 100! 100…

Java 常用 API 分类总结(算法竞赛考前速记篇)- 适用于算法竞赛(如 CCF CSP、蓝桥杯、NOI)

以下是Java 常用 API 的系统性总结,特别适用于算法竞赛(如 CCF CSP、蓝桥杯、NOI)场景。按照功能分类,并给出代表性方法及简要用法说明,方便复习与带入考场: ✅ Java 常用 API 分类总结(算法竞赛…

重复文件管理 一键清理重复 图片 文档 免费 超轻量无广告

各位电脑小卫士们!今天给你们介绍一款超厉害的软件——ZZYDupFile,它是专门搞重复文件管理的轻量级工具,能帮咱快速找到并清理电脑里的重复文件。接下来我就详细说说它的那些优点。 软件下载地址安装包 首先说说它的核心功能。它查重有好几…

本地部署企业邮箱,让企业办公更安全高效

在当今数字化办公时代,企业邮箱作为企业沟通协作的重要工具,承载着企业业务往来和办公协同的重要职能。基于安全性、个性化需求、系统集成等方面的考量,越来越多的企业倾向于选择本地部署企业邮箱,本地化部署不仅能够有效守护企业…

基于深度强化学习的智能机器人导航系统

前言 随着人工智能技术的飞速发展,机器人在日常生活和工业生产中的应用越来越广泛。其中,机器人导航技术是实现机器人自主移动的关键。传统的导航方法依赖于预设的地图和路径规划算法,但在复杂的动态环境中,这些方法往往难以适应。…

gorm 配置数据库

介绍 GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,基于数据库操作的封装,提供类似 Django ORM / SQLAlchemy 的开发体验。 特性描述支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自动迁移自动根…

k8s4部署

configMap configmap概述:数据会存储在etcd数据库,其应用场景主要在应用程序的配置 configmap支持的类型(1)键值对(2)多行数据 pod使用configmap资源有两种常见的方式(1)变量注入&a…

2025HNCTF - Crypto

Crypto lcgp 题目: from Crypto.Util.number import * import gmpy2 import random n getPrime(1024) flag bH&NCTF{ str(uuid.uuid4()).encode() b} flagbytes_to_long(flag) e 2024 cpow(e, flag, n)class LCG:def __init__(self, seed, a, b, m):sel…

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…

前后端分离开发 和 前端工程化

来源:黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)_哔哩哔哩_bilibili 前后端混合开发: 需要使用前端的技术栈开发前端的功能,又需要使用Java的技术栈…

QT线程同步 QReadWriteLock并发访问

QT多线程专栏共有17篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、QReadWriteLock、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池、ObjectThread多线程操作、 moveToThread等…

【物联网-ModBus-RTU

物联网-ModBus-RTU ■ 优秀博主链接■ ModBus-RTU介绍■(1)帧结构■(2)查询功能码 0x03■(3)修改单个寄存器功能码 0x06■(4)Modbus RTU 串口收发数据分析 ■ 优秀博主链接 Modbus …