day50 随机函数与广播机制

目录

一、随机张量的生成

1.1 torch.randn() 函数

1.2 其他随机函数

1.3 输出维度测试

二、广播机制

2.1 广播机制的规则

2.2 加法的广播机制

二维张量与一维向量相加

三维张量与二维张量相加

二维张量与标量相加

高维张量与低维张量相加

2.3 乘法的广播机制

批量矩阵与单个矩阵相乘

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

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


一、随机张量的生成

在深度学习中,我们经常需要随机生成张量,例如用于模型参数的初始化、生成测试数据或模拟输入特征。PyTorch 提供了多种随机张量生成函数,其中 torch.randn() 是最常用的一种。

1.1 torch.randn() 函数

torch.randn() 可以创建一个由标准正态分布(均值为 0,标准差为 1)随机数填充的张量。它的参数如下:

  • size:必选参数,表示输出张量的形状。

  • dtype:可选参数,指定张量的数据类型。

  • device:可选参数,指定张量存储的设备。

  • requires_grad:可选参数,是否需要计算梯度。

以下是生成不同维度张量的示例代码:

import torch# 生成标量(0维张量)
scalar = torch.randn(())
print(f"标量: {scalar}, 形状: {scalar.shape}")# 生成向量(1维张量)
vector = torch.randn(5)  # 长度为5的向量
print(f"向量: {vector}, 形状: {vector.shape}")# 生成矩阵(2维张量)
matrix = torch.randn(3, 4)  # 3行4列的矩阵
print(f"矩阵:{matrix},矩阵形状: {matrix.shape}")# 生成3维张量(常用于图像数据的通道、高度、宽度)
tensor_3d = torch.randn(3, 224, 224)  # 3通道,高224,宽224
print(f"3维张量形状: {tensor_3d.shape}")# 生成4维张量(常用于批量图像数据:[batch, channel, height, width])
tensor_4d = torch.randn(2, 3, 224, 224)  # 批量大小为2,3通道,高224,宽224
print(f"4维张量形状: {tensor_4d.shape}")

1.2 其他随机函数

除了 torch.randn(),PyTorch 还提供了其他随机函数,例如:

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

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

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

以下是示例代码:

# 生成均匀分布随机数
x = torch.rand(3, 2)  # 生成3x2的张量
print(f"均匀分布随机数: {x}, 形状: {x.shape}")# 生成随机整数
x = torch.randint(low=0, high=10, size=(3,))  # 生成3个0到9之间的整数
print(f"随机整数: {x}, 形状: {x.shape}")# 生成正态分布随机数
mean = torch.tensor([0.0, 0.0])
std = torch.tensor([1.0, 2.0])
x = torch.normal(mean, std)  # 生成两个正态分布随机数
print(f"正态分布随机数: {x}, 形状: {x.shape}")

1.3 输出维度测试

在实际的深度学习任务中,我们通常需要计算输入张量经过不同层后的输出维度。以下是卷积层、池化层、线性层等的维度变化示例:

import torch
import torch.nn as nn# 生成输入张量 (批量大小, 通道数, 高度, 宽度)
input_tensor = torch.randn(1, 3, 32, 32)  # 例如CIFAR-10图像
print(f"输入尺寸: {input_tensor.shape}")# 卷积层操作
conv1 = nn.Conv2d(in_channels=3,        # 输入通道数out_channels=16,      # 输出通道数(卷积核数量)kernel_size=3,        # 卷积核大小stride=1,             # 步长padding=1             # 填充
)
conv_output = conv1(input_tensor)  # 由于 padding=1 且 stride=1,空间尺寸保持不变
print(f"卷积后尺寸: {conv_output.shape}")# 池化层操作 (减小空间尺寸)
pool = nn.MaxPool2d(kernel_size=2, stride=2)  # 创建一个最大池化层
pool_output = pool(conv_output)
print(f"池化后尺寸: {pool_output.shape}")# 将多维张量展平为向量
flattened = pool_output.view(pool_output.size(0), -1)
print(f"展平后尺寸: {flattened.shape}")# 线性层操作
fc1 = nn.Linear(in_features=4096,     # 输入特征数out_features=128      # 输出特征数
)
fc_output = fc1(flattened)
print(f"线性层后尺寸: {fc_output.shape}")# 再经过一个线性层(例如分类器)
fc2 = nn.Linear(128, 10)  # 假设是10分类问题
final_output = fc2(fc_output)
print(f"最终输出尺寸: {final_output.shape}")

二、广播机制

PyTorch 的广播机制(Broadcasting)是一种强大的张量运算特性,允许在不同形状的张量之间进行算术运算,而无需显式地扩展张量维度或复制数据。这种机制使得代码更简洁高效,尤其在处理多维数据时非常实用。

2.1 广播机制的规则

当对两个形状不同的张量进行运算时,PyTorch 会按以下规则自动处理维度兼容性:

  1. 从右向左比较维度:从张量的最后一个维度(最右侧)开始向前逐维比较。

  2. 维度扩展条件

    • 相等维度:若两个张量在某一维度上大小相同,则继续比较下一维度。

    • 一维扩展:若其中一个张量在某一维度上大小为 1,则该维度会被扩展为另一个张量对应维度的大小。

    • 不兼容错误:若某一维度大小既不相同也不为 1,则抛出 RuntimeError

  3. 维度补全规则:若一个张量的维度少于另一个,则在其左侧补 1 直至维度数匹配。

2.2 加法的广播机制

以下是几个加法广播的例子:

二维张量与一维向量相加
a = torch.tensor([[10], [20], [30]])  # 形状: (3, 1)
b = torch.tensor([1, 2, 3])           # 形状: (3,)
result = a + bprint("原始张量a:")
print(a)print("\n原始张量b:")
print(b)print("\n加法结果:")
print(result)
三维张量与二维张量相加
a = torch.tensor([[[1], [2]], [[3], [4]]])  # 形状: (2, 2, 1)
b = torch.tensor([[10, 20]])               # 形状: (1, 2)
result = a + bprint("原始张量a:")
print(a)print("\n原始张量b:")
print(b)print("\n加法结果:")
print(result)
二维张量与标量相加
a = torch.tensor([[1, 2], [3, 4]])  # 形状: (2, 2)
b = 10                              # 标量,形状视为 ()
result = a + bprint("原始张量a:")
print(a)print("\n标量b:")
print(b)print("\n加法结果:")
print(result)
高维张量与低维张量相加
a = torch.tensor([[[1, 2], [3, 4]]])  # 形状: (1, 2, 2)
b = torch.tensor([[5, 6]])            # 形状: (1, 2)
result = a + bprint("原始张量a:")
print(a)print("\n原始张量b:")
print(b)print("\n加法结果:")
print(result)

2.3 乘法的广播机制

矩阵乘法(@)的广播机制除了遵循通用广播规则外,还需要满足矩阵乘法的维度约束:

  • 最后两个维度必须满足:A.shape[-1] == B.shape[-2](即 A 的列数等于 B 的行数)。

  • 其他维度(批量维度):遵循通用广播规则。

以下是几个矩阵乘法广播的例子:

批量矩阵与单个矩阵相乘
A = torch.randn(2, 3, 4)  # 形状: (2, 3, 4)
B = torch.randn(4, 5)     # 形状: (4, 5)
result = A @ B            # 结果形状: (2, 3, 5)print("A形状:", A.shape)
print("B形状:", B.shape)
print("结果形状:", result.shape)
批量矩阵与批量矩阵相乘(部分广播)
A = torch.randn(3, 2, 4)  # 形状: (3, 2, 4)
B = torch.randn(1, 4, 5)  # 形状: (1, 4, 5)
result = A @ B            # 结果形状: (3, 2, 5)print("A形状:", A.shape)
print("B形状:", B.shape)
print("结果形状:", result.shape)
三维张量与二维张量相乘(高维广播)
A = torch.randn(2, 3, 4, 5)  # 形状: (2, 3, 4, 5)
B = torch.randn(5, 6)        # 形状: (5, 6)
result = A @ B               # 结果形状: (2, 3, 4, 6)print("A形状:", A.shape)
print("B形状:", B.shape)
print("结果形状:", result.shape)

@浙大疏锦行

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

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

相关文章

Java持久层技术对比:Hibernate、MyBatis与JPA的选择与应用

目录 简介持久层技术概述Hibernate详解MyBatis详解JPA详解技术选型对比最佳实践与应用场景性能优化策略未来发展趋势总结与建议 简介 在Java企业级应用开发中,持久层(Persistence Layer)作为连接业务逻辑与数据存储的桥梁,其技…

【2025CVPR】模型融合新范式:PLeaS算法详解(基于排列与最小二乘的模型合并技术)

本文深入解析ICLR 2025顶会论文《PLeaS: Merging Models with Permutations and Least Squares》,揭示模型融合领域突破性进展. 一、问题背景:模型合并的核心挑战 随着开源模型的爆发式增长,如何高效合并多个专用模型成为关键挑战。传统方法存在三大痛点: ​初始化依赖​…

磁盘空间清道夫FolderSize 系列:可视化分析 + 重复文件识别,

各位电脑小能手们,今天来给大家唠唠Folder类软件!这玩意儿主要是为了文件夹管理、监控、安全还有优化这些需求设计的,不同工具的功能各有侧重。下面我就结合多个搜索结果,给大家分类介绍一下。 软件下载地址安装包 首先是文件夹空…

嵌入式全栈面试指南:TCP/IP、C 语言基础、STM32 外设与 RT‑Thread

作为嵌入式工程师,面试时往往不仅要展示基础编程能力,还要兼具网络协议、硬件驱动、实时操作系统(RTOS)等方面的知识深度。本文将从TCP/IP 协议、C 语言核心基础、STM32 IO 与外设驱动、RT‑Thread 及其多任务/IPC四大模块进行全面…

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…

软件功能测试报告都包含哪些内容?

软件功能测试报告是软件开发生命周期中的重要文档,主要涵盖以下关键内容:    1.测试概况:概述测试目标、范围和方法,确保读者对测试背景有清晰了解。 2.测试环境:详细描述测试所用的硬件、软件环境,确保…

OpenCV CUDA模块图像处理------双边滤波的GPU版本函数bilateralFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数在 GPU 上执行双边滤波操作,是一种非线性平滑滤波器,能够在 保留边缘的同时去除噪声。 函数原型 void cv::cuda:…

Perplexity AI:重塑你的信息探索之旅

在信息爆炸的时代,如何快速、精准地获取所需知识,并将其转化为行动力?答案或许就藏在 Perplexity AI 这款强大的智能工具中。它不仅仅是一个搜索引擎,更是一个能理解你、与你对话、为你深度解析信息的智能伙伴。告别繁琐的信息筛选…

Java高级反射实战:15个场景化编程技巧与底层原理解析

引用 在Java的世界里,反射机制如同赋予开发者一把“万能钥匙”,它打破了静态编程的边界,让代码在运行时拥有动态获取类信息、操作对象属性和方法的能力。从Spring框架的依赖注入,到MyBatis的SQL映射生成;从JSON序列化…

构建 MCP 服务器:第 3 部分 — 添加提示

这是我们构建 MCP 服务器的四部分教程的第三部分。在第一部分中,我们使用基本资源创建了第一个MCP 服务器;在第二部分中,我们添加了资源模板并改进了代码组织。现在,我们将进一步重构代码并添加提示功能。 什么是 MCP 提示&#…

MySQL 索引优化(Explain执行计划) 详细讲解

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 MySQL 索引优化(Explain执行计划…

使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理

一、什么是通义灵码(TONGYI Lingma)? 通义灵码是阿里巴巴推出的智能代码辅助工具,结合大模型技术,支持代码生成、用例生成、代码补全等功能,能极大提升开发效率。 二、在 IDEA 中安装通义灵码插件 打开 In…

AI编程在BOSS项目的实践经验分享

前言 在人工智能技术革新浪潮的推动下,智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能,显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员,…

JVM 类加载器 详解

类加载器 两个类来源于同一个 Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等 这里所指的“相等”,包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返…

Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象

文章目录 一、构造函数实例化对象1、基本语法2、构造函数与原型的关系3、完整的原型链4、构造函数的特点5、prototype与__proto__属性5.1、对象实例的__proto__属性5.2、prototype属性仅存在于函数对象5.3、实例与原型的关系5.4、获取对象原型 6、注意事项 前言: 在…

自动驾驶科普(百度Apollo)学习笔记

1. 写在前面 在过去的几年里,自动驾驶技术取得飞速发展,人类社会正逐渐走向一个新时代,这个时代中,汽车不仅仅是一个交通工具,更是一个智能的、能够感知环境、做出决策并自主导航的机器伙伴。现在正好也从事这块的工作…

Windows应用-音视频捕获

下载“Windows应用-音视频捕获”项目 本应用可以同时捕获4个视频源和4个音频源,可以监视视频源图像,监听音频源;可以将视频源图像写入MP4文件,将音频源写入MP3或WAV文件;还可以录制系统播放的声音。本应用使用MFC对话框…

MATLAB生成大规模无线通信网络拓扑(任意节点数量)

功能: 生成任意节点数量的网络拓扑,符合现实世界节点空间分布和连接规律 效果: 30节点: 100节点: 500节点: 程序: %创建时间:2025年6月8日 %zhouzhichao %自然生长出n节点的网络% …

TDengine 开发指南—— UDF函数

UDF 简介 在某些应用场景中,应用逻辑需要的查询功能无法直接使用内置函数来实现,TDengine 允许编写用户自定义函数(UDF),以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后,可以像系统内置函数一…

C#提取CAN ASC文件时间戳:实现与性能优化

C#提取CAN ASC文件时间戳:实现与性能优化 在汽车电子和工业控制领域,CAN总线是最常用的通信协议之一。而ASC(ASCII)文件作为CAN总线数据的标准日志格式,广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…