当前位置: 首页 > news >正文

深度学习02-pytorch-04-张量的运算函数

在 PyTorch 中,张量(tensor)运算是核心操作之一,PyTorch 提供了丰富的函数来进行张量运算,包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途:

1. 基本数学运算

  • 加法运算torch.add(a, b) 或者直接使用 +

    a = torch.tensor([1, 2])
    b = torch.tensor([3, 4])
    c = torch.add(a, b)  # [4, 6]
    # 或者
    c = a + b

  • 减法运算torch.sub(a, b) 或者直接使用 -

    c = torch.sub(a, b)  # [-2, -2]
    # 或者
    c = a - b

  • 乘法运算(逐元素)torch.mul(a, b) 或者直接使用 *

    c = torch.mul(a, b)  # [3, 8]
    # 或者
    c = a * b

  • 除法运算(逐元素)torch.div(a, b) 或者直接使用 /

    c = torch.div(a, b)  # [0.3333, 0.5]
    # 或者
    c = a / b

  • 指数运算torch.pow(a, b) 或者 a ** b

    c = torch.pow(a, b)  # a^b -> [1^3, 2^4] = [1, 16]
    # 或者
    c = a ** b

  • 求幂函数torch.sqrt(a)torch.exp(a)torch.log(a)

    c = torch.sqrt(torch.tensor([4.0, 9.0]))  # [2.0, 3.0]
    d = torch.exp(torch.tensor([1.0, 2.0]))  # e^1, e^2
    e = torch.log(torch.tensor([1.0, 2.0]))  # log(1), log(2)

2. 聚合操作

  • 求和torch.sum(tensor, dim=None)

    a = torch.tensor([[1, 2], [3, 4]])
    total_sum = torch.sum(a)  # 全局求和: 10
    row_sum = torch.sum(a, dim=1)  # 对每一行求和: [3, 7]

  • 求平均值torch.mean(tensor, dim=None)

    avg = torch.mean(a.float())  # 平均值: 2.5

  • 最大值torch.max(tensor)torch.max(tensor, dim)

    max_val = torch.max(a)  # 最大值: 4
    max_val_row, idx = torch.max(a, dim=1)  # 每一行的最大值: [2, 4]

  • 最小值torch.min(tensor)torch.min(tensor, dim)

    min_val = torch.min(a)  # 最小值: 1

  • 标准差torch.std(tensor)

    std = torch.std(a.float())  # 标准差

3. 线性代数运算

  • 矩阵乘法torch.mm(a, b) 或者使用 @

    a = torch.tensor([[1, 2], [3, 4]])
    b = torch.tensor([[5, 6], [7, 8]])
    c = torch.mm(a, b)  # 矩阵乘法
    # 或者
    c = a @ b

  • 矩阵转置torch.t(tensor) 或者使用 .T

    a_t = torch.t(a)  # 转置
    # 或者
    a_t = a.T

  • 矩阵求逆torch.inverse(tensor)

    a = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
    a_inv = torch.inverse(a)  # 求矩阵的逆

  • 行列式torch.det(tensor)

    det = torch.det(a)  # 计算行列式

  • 特征值和特征向量torch.eig(tensor, eigenvectors=True)

    e_vals, e_vecs = torch.eig(a, eigenvectors=True)  # 计算特征值和特征向量

4. 张量形状操作

  • 张量重塑torch.reshape(tensor, new_shape)tensor.view(new_shape)

    a = torch.tensor([[1, 2], [3, 4], [5, 6]])
    reshaped = torch.reshape(a, (2, 3))  # 改变形状为 (2, 3)

  • 张量扩展torch.unsqueeze(tensor, dim)torch.squeeze(tensor, dim)

    a = torch.tensor([1, 2, 3])
    unsqueezed = torch.unsqueeze(a, 0)  # 在第0维添加一个新维度 -> [[1, 2, 3]]
    squeezed = torch.squeeze(unsqueezed)  # 移除维度 -> [1, 2, 3]

  • 拼接张量torch.cat(tensors, dim)torch.stack(tensors, dim)

    a = torch.tensor([1, 2])
    b = torch.tensor([3, 4])
    concatenated = torch.cat((a, b), dim=0)  # 拼接 -> [1, 2, 3, 4]stacked = torch.stack((a, b), dim=0)  # 堆叠 -> [[1, 2], [3, 4]]

5. 索引操作

  • 通过索引选择元素tensor[index]

    a = torch.tensor([[1, 2], [3, 4], [5, 6]])
    selected = a[0, 1]  # 选择第0行第1列的元素 -> 2

  • 高级索引tensor[range]、布尔索引等

    a = torch.tensor([1, 2, 3, 4, 5])
    selected = a[a > 3]  # 选择大于3的元素 -> [4, 5]

6. 随机数生成

  • 均匀分布随机数torch.rand(size)

    random_tensor = torch.rand(3, 3)  # 生成一个 3x3 的均匀分布随机张量

  • 正态分布随机数torch.randn(size)

    normal_random = torch.randn(3, 3)  # 生成一个 3x3 的正态分布随机张量

  • 指定范围的整数随机数torch.randint(low, high, size)

    randint_tensor = torch.randint(0, 10, (3, 3))  # 生成 0 到 10 之间的随机整数

7. 广播机制

  • 广播运算:当张量的形状不同,但维度兼容时,PyTorch 会自动应用广播机制扩展张量。

    a = torch.tensor([1, 2, 3])
    b = torch.tensor([[1], [2], [3]])
    c = a + b  # 广播操作

8. 自动微分

  • 启用自动微分requires_grad=True

    x = torch.tensor(2.0, requires_grad=True)
    y = x ** 2
    y.backward()  # 计算梯度
    print(x.grad)  # 输出: 4.0

总结

PyTorch 中的张量运算函数非常丰富,从基本的数学运算到高级的线性代数操作、形状调整和随机数生成,这些函数让张量的处理非常灵活和高效。通过这些运算,你可以实现各种数值计算和深度学习模型的训练。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【计算机网络】运输层协议解析
  • 分布式锁优化之 使用lua脚本改造分布式锁保证判断和删除的原子性(优化之LUA脚本保证删除的原子性)
  • 全栈项目小组【算法赛】题目及解题
  • 《机器人SLAM导航核心技术与实战》第1季:第9章_视觉SLAM系统
  • Pandas简介
  • HTML5中新增元素介绍
  • 博图V16升级V19前后内存对比
  • 华为OD机试真题-IPv4地址转换成整数-2024年OD统一考试(E卷)
  • ESP32 入门笔记02: ESP32-C3 系列( 芯片ESP32-C3FN4) (ESP-IDF + VSCode)
  • 【Nginx】Nginx 监控详解
  • 编写第一个hadoop3.3.6的mapreduce程序
  • vue3<script setup>中使用reactive包裹的对象被重新赋值失去响应式原因和解决方式
  • 面试金典题2.5
  • 【软件工程】需求分析概念
  • 【Delphi】Delphi 中的 LiveBindings 使用场景与概念
  • Angular 响应式表单之下拉框
  • canvas 高仿 Apple Watch 表盘
  • Docker容器管理
  • Javascript 原型链
  • JS基础之数据类型、对象、原型、原型链、继承
  • Next.js之基础概念(二)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python学习之路13-记分
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 试着探索高并发下的系统架构面貌
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • PostgreSQL之连接数修改
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #QT(一种朴素的计算器实现方法)
  • #VERDI# 关于如何查看FSM状态机的方法
  • (4)(4.6) Triducer
  • (ros//EnvironmentVariables)ros环境变量
  • (SpringBoot)第二章:Spring创建和使用
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十一)手动添加用户和文件的特殊权限
  • (转)负载均衡,回话保持,cookie
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 使用配置文件
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [.net]官方水晶报表的使用以演示下载
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BZOJ2208][Jsoi2010]连通数
  • [CakePHP] 在Controller中使用Helper