张量-pytroch基础(2)

张量-pytroch网站-笔记

张量是一种特殊的数据结构,跟数组(array)和矩阵(matrix)非常相似。

张量和 NumPy 中的 ndarray 很像,不过张量可以在 GPU 或其他硬件加速器上运行。

事实上,张量和 NumPy 数组有时可以共享底层内存,也就是说,不用来回复制数据(具体可以参考:与 NumPy 的桥接)。

张量还被优化过,用来自动求导

概念通俗理解
Tensor(张量)就是一个高级的“数组”,支持多维度、高性能计算
用途是 PyTorch 中处理数据的核心工具,用来装模型的输入、输出和参数
优势可以在 GPU 上运行、和 NumPy 兼容、支持自动求导

 初始化一个张量(Tensor)
张量可以用很多不同的方法来创建。下面是一些例子:

从已有数据直接创建
张量可以直接用数据来创建,数据类型(比如整数、浮点数)会自动识别。

  • 张量就像“多维数组”

  • 你可以直接传入一个 Python 列表或列表嵌套,就能创建出张量

  • PyTorch 会自动判断你传入的数据是什么类型,比如整数、浮点数等

 从 NumPy 数组创建张量
张量可以从 NumPy 数组创建

  • PyTorch 和 NumPy 是好兄弟

  • 可以:

    • 把 NumPy 数组变成张量:用于神经网络训练

    • 也可以把张量变回 NumPy 数组:用于数学计算或绘图

  • 它们还可以共享内存,不需要复制,提高效率

反过来,把张量变成 NumPy:

 

从另一个张量创建新张量:
新张量会自动保留原张量的属性(比如形状、数据类型),除非你手动改了它。 

使用 torch.ones_like(x_data) 创建一个 x_data 形状完全相同,但元素全部为 1 的张量。 

使用 torch.rand_like(x_data) 创建一个和 x_data 形状一样的 随机数张量(数值范围在 [0, 1) 之间的浮点数)

使用随机值或常数值创建张量时,shape 是一个表示张量维度的元组。在下面这些函数中,shape 用来确定输出张量的维度。

张量(Tensor)的属性用来描述它的:

  1. 形状(shape)

  2. 数据类型(datatype)

  3. 所在设备(device)

 

PyTorch 提供了 超过 1200 种张量操作,包括:

  • 算术运算(加减乘除)

  • 线性代数运算(矩阵乘法、逆矩阵等)

  • 矩阵操作(转置、索引、切片等)

  • 采样(比如从概率分布中随机取样)

所有这些操作都可以在:

  • CPU

  • 或者加速器上运行,例如:

    • CUDA(NVIDIA 的 GPU)

    • MPS(Mac 上的 GPU 加速)

    • MTIA, XPU(英特尔或其他厂商的加速器)

 

如果在用 Google Colab(一个在线的 Python 运行环境):

  • 可以点击菜单栏的:

    Runtime > Change runtime type > GPU

  • 来分配一个 GPU 加速器,从而提升运算效率。

 

  • 默认情况下,张量是在 CPU 上创建的。

  • 如果想让它在 GPU 上运算,就需要用 .to() 方法显式地移动:

  • device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    x = x.to(device)
    

    在不同设备(比如从 CPU → GPU)之间移动大张量时,会消耗时间和内存

  • PyTorch 支持大量张量操作,这些操作可以在 CPU 或各种加速器(如 GPU)上运行。但默认张量是在 CPU 上,需要手动移动到 GPU,而且大张量的设备间拷贝是耗资源的,要谨慎操作。

  • 你可以尝试一下列表中的一些操作(指张量的操作)。如果你熟悉 NumPy 的 API(编程接口),你会发现 PyTorch 的张量 API 用起来非常简单,就像“轻而易举”一样

4行4列 标准索引和切片方法

dim=1 列,cat合并

  • torch.cat 是 PyTorch 中的一个函数,用来拼接多个张量

  • 拼接时要求:除了指定拼接的那个维度以外,其他维度必须一致

  1. tensor.T:表示张量 tensor转置(把行列对换)。

  2. @matmul() 都是做 矩阵乘法 的方式,它们等价。

  3. out=y3 是在指定:把结果 直接存储进 y3,不返回新张量,节省内存。

  • 这部分不是做矩阵乘法,而是逐个元素相乘(element-wise multiply)

  • 也就是说 tensor[i][j] * tensor[i][j],每个元素单独相乘。

  • 和矩阵乘法的规则不同,不涉及转置、不涉及矩阵行列数匹配

  • 总结对比:

    运算类型操作符 / 函数是否逐元素?是否需要转置?输出维度变化?
    矩阵乘法@, matmul()❌ 否✅ 通常需要转置✅ 会变
    逐元素乘法(Hadamard)*, mul()✅ 是❌ 不需要❌ 不变

 单元素张量(single-element tensor)是指只有一个元素的张量。
比如你对一个张量做了求和(sum)、平均(mean)等操作,结果就是一个单个值的张量。
如果你想把这个张量变成普通的 Python 数值(比如 intfloat),可以使用 .item() 方法

In-place operations(就地操作)是指那些直接把结果存回原变量的操作。
这类操作的特点是:不会创建新张量,而是直接修改原张量本身

它们通常在函数名后面加一个 下划线 _ 来表示,比如:

  • x.copy_(y):把 y 的值复制进 x,直接修改 x 的内容。

  • x.t_():将 x 转置结果直接替代原来的 x

 就地操作(in-place operations)虽然可以节省一些内存
但在计算梯度(导数)时可能会出问题,因为它们会立即丢失计算历史(history)
所以一般不推荐在需要反向传播(backpropagation)的时候使用 in-place 操作

在 PyTorch 中,自动求导(autograd)系统需要记录每一个操作的计算历史,以便后面做反向传播(计算梯度)。

  • 普通操作会保留这些历史;

  • 就地操作(比如 x += 1x.copy_(...))会直接覆盖原变量的值,导致 PyTorch 无法回溯计算路径,从而报错或者计算错误。

  • in-place 操作虽然省内存,但有可能破坏 PyTorch 的计算图,导致梯度无法正确求解,因此在训练模型时最好避免使用。

 

当张量(Tensor)位于 CPU 上时,它和 NumPy 数组可以共享底层内存地址(memory location)
所以修改其中一个,另一个也会跟着改变

 

改动 NumPy,也会影响张量 

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

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

相关文章

marked库(高效将 Markdown 转换为 HTML 的利器)

文章目录 前言使用基本使用自定义渲染器例子 代码高亮 前言 最近尝试了一下通过星火大模型将ai引入到项目上,但是ai返回的数据可以显而易见的发现是markedown语法的,那么就需要一个工具,将类似这种的格式转换为markdown格式 Marked 是一个用…

调用deepseek大模型时智能嵌入函数

DeepSeek-R1 当前炙手可热,以其强大的自然语言处理和推理能力而广受赞誉。饶是如此,却并不原生支持函数调用(function_call),这是开发过程中不可或缺的一部分。虽有第三方调校的模型支持,然终非官方自带,还需假以时日。本文虽然简短,应该是全网写得最通透的了吧。 …

SQLMesh系列教程:基于指标构建一致的分析语义层应用实践

本文深入探讨SQLMesh指标框架的核心概念、定义方法及应用场景。通过统一的语义层管理,SQLMesh解决了数据分析中指标定义不一致的痛点,实现了跨团队协作的数据一致性。文章包含指标定义语法详解、自动表连接机制解析、派生指标构建方法,并通过…

基于OpenCV+MediaPipe手部追踪

一、技术栈 1. OpenCV(Open Source Computer Vision Library) 性质:开源计算机视觉库(Library) 主要功能: 图像/视频的基础处理(读取、裁剪、滤波、色彩转换等) 特征检测&#xf…

机器学习ML极简指南

机器学习是现代AI的核心,从推荐系统到自动驾驶,无处不在。但每个智能应用背后,都离不开那些奠基性的模型。本文用最简练的方式拆解核心机器学习模型,助你面试时对答如流,稳如老G。 线性回归 线性回归试图通过"最…

装饰器模式:如何用Java打扮一个对象?

引言装饰器模式具体实例共有接口类具体被装饰类抽象装饰器类具体装饰器类 测试装饰器模式的实际应用Java I/O 体系游戏开发中的角色装备系统 总结 引言 在生活中,我们都知道一句话,“人靠衣装马靠鞍”,如果想要让自己在别人眼里看起来更加好…

【Easylive】HikariCP 介绍

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 HikariCP 是目前 Java 生态中最快、最轻量级的高性能 JDBC 连接池,被 Spring Boot 2.x 及更高版本选为 默认数据库连接池。它的名字来源于日语“光”(Hikari&#xf…

清晰易懂的Cursor实现AI编程从安装到实战TodoList开发

一、Cursor简介与安装部署 什么是Cursor? Cursor是一款基于AI的智能代码编辑器,它集成了强大的AI编程助手功能,能够通过自然语言交互帮助开发者生成、优化和调试代码。与传统的代码编辑器不同,Cursor可以理解你的编程意图&#…

【Django】教程-2-前端-目录结构介绍

【Django】教程-1-安装创建项目目录结构介绍 3. 前端文件配置 3.1 目录介绍 在app下创建static文件夹, 是根据setting中的配置来的 STATIC_URL ‘static/’ templates目录,编写HTML模板(含有模板语法,继承,{% static ‘xx’ …

注意!ChatGPT 全新 AI 图像功能延迟对免费用户开放

2025 年 3 月 25 日,OpenAI 正式宣布在 ChatGPT 中推出基于 GPT-4o 模型的全新原生图像生成功能。 这一功能允许用户通过对话生成和编辑图像,支持从写实风格到插图风格的多种形式。OpenAI 首席执行官萨姆・奥特曼(Sam Altman)在社…

优化webpack打包体积思路

Webpack 打包过大的问题通常会导致页面加载变慢,影响用户体验。可以从代码优化、依赖优化、构建优化等多个角度入手来减少打包体积: 代码优化 (1)按需加载(代码拆分) ① 路由懒加载 如果你的项目使用 Vu…

HarmonyOS Next~鸿蒙元服务开发指南:核心功能与实践

HarmonyOS Next~鸿蒙元服务开发指南:核心功能与实践 一、元服务核心概念 原子化服务定义 元服务(原子服务)是鸿蒙系统的核心架构单元,具备独立业务能力的轻量化服务模块,支持免安装、跨设备调用和智能分发…

git错误:fatal: detected dubious ownership in repository at xxxxxx

1、报错说明 这个错误通常是由于Git仓库目录的拥有者或权限问题引起的。Git检测到仓库目录的所有权可能存在不一致或不安全的情况。 通常导致此报错的可能原因: (1)文件或目录的拥有者不一致: 仓库目录中的某些文件或子目录可能…

【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解

OSI模型 导读一、概念二、模型层次结构2.1 物理层(Physical Layer)2.2 数据链路层(Data Link Layer)​2.3 ​网络层(Network Layer)​2.4 ​传输层(Transport Layer)​2.5 ​会话层&…

零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享

CTF(Capture The Flag)比赛中的高频解题技巧通常涵盖了以下几类技术,涉及从逆向工程、二进制漏洞利用到Web安全、密码学等多个领域。以下是一些高频解题技巧: 1. 逆向工程(Reverse Engineering) 静态分析&a…

markdown 文件转 word

将 Markdown 文件转换为 Word 文档,可以使用多种方法。以下是几种常见的方法: 方法1:使用在线转换工具 有许多在线服务可以将 Markdown 文件转换为 Word 文档。例如: Pandoc - 一个非常流行的命令行工具,也可以用来转…

【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)

【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…

T11 TensorFlow入门实战——优化器对比实验

🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…

Docker部署sprintboot后端项目

创建Docker网络 docker network create icjs 部署Redis docker run -d \--network icjs \--name redis \-p 6379:6379 \redis:latest数据持久化 docker run --restartalways --network icjs -p 6379:6379 --name redis -v /opt/docker/redis/redis.conf:/etc/redis/redis.c…

01小游戏

问题描述 小明得到了一个长度为 nn 的字符串 ss ,该字符串都是由数字 00 和 11 组成,并且下标从 11 开始,小明现在需要对这个字符串进行 qq 次操作,每次操作包含以下两种操作之一: 操作 11 :小明查询该字符…