动手学深度学习——数据操作笔记

1. 张量概念

 张量本质上是一个n维数组,它在numpy中为ndarray,  在pytorch中称为tensor , 两者的区别在于:

  • numpy仅支持CPU计算
  • tensor能支持GPU运算,并且支持自动微分,更适合深度学习

2. 张量的访问

一个二维矩阵a,可以使用切片的方式灵活访问:

  • 访问指定元素:a [1,2]
  • 访问一整行元素:a [1,:]
  • 访问一整列元素:a[:,1]
  • 访问1到3行之间、第1列以后的矩形区域:a[1:3, 1:],切片统一是左闭右开
  • 跳跃访问:a[::3, ::2] 表示每3行取一行(0,3,6……)、每2列取一列(0,2,4……)的方式访问

3. 张量的初始化

  • x = torch.arrange(12) : 初始化元素数量为12的一维张量(tensor), 元素值分别为从0开始的前12个整数。
  • x.shape:张量的形状,即张量的维度信息,例如:1维12列。
  • x.numel:元素数量,类似于数组的len函数。
  • y = x.reshape(3,4): 修改张量的形状为3行4列,元素数量及值不变,y只是x的一个view。
  • torch.zeros((2,3,4)) 和torch.ones((2,3,4)),torch.randn(2,3,4): 创建指定形状的张量,并初始化为全0或全1或全随机数。
  • torch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) : 创建一个张量并为每个元素赋确定值。

4. 运算

标准运算:直接使用算术运算符+、-、*、/对具有相同形状的张量进行操作,它将对每个位置的元素分别使用运算符进行操作。

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # **运算符是求幂运算# 输出
(tensor([ 3.,  4.,  6., 10.]),tensor([-1.,  0.,  2.,  6.]),tensor([ 2.,  4.,  8., 16.]),tensor([0.5000, 1.0000, 2.0000, 4.0000]),tensor([ 1.,  4., 16., 64.]))

求冥运算:

torch.exp(x)# 输出
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

 多个张量连接:

# dtype可以指定初始元素值的类型为float,而不是默认的整数。
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
# X
(tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.]]),
# Y
(tensor([[ 2.,  1.,  4.,  3.],[ 1.,  2.,  3.,  4.],[ 4.,  3.,  2.,  1.]]),# dim=0表示按照第1维(即行)进行数据连接,将Y矩阵每一行连接到X矩阵每一行的后面,
# dim=1则表示按照第二维(即列)进行数据列表
torch.cat((X, Y), dim=0), 
# 输出tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],[ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],[ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))

等值判断:等于每个位置的元素分别进行等值判断

X == Y
# 输出
tensor([[False,  True, False,  True],[False, False, False, False],[False, False, False, False]])

求和:对张量中所有元素求和,产生一个单元素张量

X.sum()

5. 广播机制

用于对形状不同的矩阵执行按元素操作,工作机制为:

  • 通过复制元素来扩展矩阵,以便两个张量具有相同的形状。
  • 对扩展后相同形状的矩阵执行上述操作。

两个张量:a 为3行1列,b为1行2列

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b# 输出
(tensor([[0],[1],[2]]),tensor([[0, 1]]))

形状不同的张量进行算术运算时,会自动扩展为相同的形状后再进行运算。

a + btensor([[0, 1],[1, 2],[2, 3]])

6. 切片赋值

  • 指定元素赋值
X[1, 2] = 9
  • 多个元素赋相同的值
# 矩阵前两行的每个元素都赋值12
X[0:2, :] = 12 # 输出X
tensor([[12., 12., 12., 12.],[12., 12., 12., 12.],[ 8.,  9., 10., 11.]])

7. 原地操作

  有些操作会引起新分配内存,例如:

before = id(Y)
# 这一步运算后,Y已经指向了另一个地址
Y = Y + X
id(Y) == before# 输出
False

这会带来的问题是:在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新。

 原地操作的方法:

# 原地操作写法-1
Y[:] = X + Y
# 原地操作写法-2
X += Y

8. 张量与numpy的转换

  • A = X.numpy()     # 张量转换为numpy数组
  • B = torch.tensor(A)   # numpy数组转换为张量
  • a.item()           # 将只有一个元素的张量转换为普通的python变量

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

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

相关文章

精度论文Generative Prompt Model for Weakly Supervised Object Localization

Generative Prompt Model for Weakly Supervised Object Localization 中国科学院大学&&浙江大学CVPR20231.Abstract 当从图像类别标签中学习对象定位模型时,弱监督对象定位(WSOL)仍然具有挑战性, 传统的鉴别训练激活模型的方法忽略了具有代表性但鉴别性较差的对象…

【UE 材质】雨滴效果

在上一篇博客(【UE 材质】表面湿润效果)的基础上继续实现物体表面附加雨滴的效果 效果 步骤 1. 下载所需纹理 2. 创建一个材质并打开,添加如下节点,我们将纹理的RG通道输出的值和1组成一个三维向量,作为基本的法线效…

SAP 变更记录表查询使用逻辑简介

通常用户在遇到问题后,经常会问某个单据的变更记录,很多模块中在前台的操作界面中都根据对应的菜单栏中可以找到对应的变更记录,像销售订单、交货单、采购申请、采购订单都在菜单栏位中都可以查询到对应的修改记录,但是对于想批量…

CentOS-7安装Mysql并允许其他主机登录

一、通用设置(分别在4台虚拟机设置) 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入: 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服…

揭秘APP广告变现秘籍:月入过万!

在移动应用的黄金时代,我们见证了无数创新和变革。然而,随着市场日益饱和,开发者和公司开始寻求新的方式来提高收益,而广告变现无疑是其中的关键。 对于移动应用来说,如何高效利用APP内的用户体验来提高广告收益是一个…

Python11个入门级知识点

Python被誉为全世界高效的编程语言,同时也被称作是“胶水语言”,那它为何能如此受欢迎,下面我们就来说说Python入门学习的必备11个知识点,也就是它为何能够如此受欢迎的原因. Python 简介 Python 是一个高层次的结合了解释性、编…

【1431】java学习网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 学习网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

【VSCode调试技巧】Pytorch分布式训练调试

最近遇到个头疼的问题,对于单机多卡的训练脚本,不知道如何使用VSCode进行Debug。 解决方案: 1、找到控制分布式训练的启动脚本,在自己的虚拟环境的/lib/python3.9/site-packages/torch/distributed/launch.py中 2、配置launch.…

【Java框架】SpringBoot(二)核心配置

目录 yml文件什么是yml文件yml文件的优点使用场景脚本语言序列化配置文件 yml的基本语法yml支持的数据类型字面量对象(属性和值)、Map(键值对)数组复合结构 Spring Boot配置文件的值注入第一种读取方式Value第二种读取方式ConfigurationProperties第三种读取方式自动装配Enviro…

【Linux】详解信号的分类如何自定义信号的作用

一、信号的定义 Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式。在操作系统中,信号是一种进程间通讯的有限制的方式,主要用于提醒进程某个事件已经发生。信号在Unix、类Unix以及其他POSIX兼容的操作系统中广泛应用。它作为一种异步的通知…

【DVadmin教程】新增一个app并且创建一个curd模型

下载dvadmin 在gitee上搜索 django-vue-admin 别选错了,选择那个星最多的 gitee上会推荐移步 django-vue3-admin 别上当,用那个会踩坑,此教程就不适用了; 运行后端 后端 创建APP python manage.py startapp rules调整位置 为了…

java学习笔记1

java基础入门 1 初识java 1.1 jdk安装 1.1.1 下载jdk https://www.oracle.com/java/technologies/downloads/#java8-windows1.1.2 安装jdk jdk-8u361-windows-x64.exe安装到D:\Program Files\Java\jdk1.8.0_361安装jre,修改地址到D:\Program Files\Java\jre1.8.0_361jdk安装…

【JAVA进阶篇教学】第二篇:JDK8中Lambda表达式

博主打算从0-1讲解下java进阶篇教学,今天教学第二篇:JDK8中Lambda表达式。 Lambda 表达式是 Java 8 中引入的一项重要特性,它允许您以更简洁、更紧凑的方式编写匿名函数。Lambda 表达式使得函数式编程在 Java 中变得更加容易和优雅。下面我将…

C++|模板进阶(非类型模板参数+特化)

目录 一、非类型模板参数 二、模板特化 2.1函数模板特化 2.2类模板特化 2.2.1全特化 2.2.2偏特化 三、模板不支持分离编译 四、模板优缺点 一、非类型模板参数 在模板初阶中,所学习的模板的参数是类型形参,但其实还有非类型形参。 类型形参&am…

boa.conf配置详解

boa的配置文件路径:/etc/boa/boa.conf Port 80 # 监听的端口号,缺省值是80 若80被占用,可修改监听端口为其他未占用端口(如:88) Listen 192.68.0.5 # 绑定调用的IP地址,一般注释掉,…

汇编期末复习知识点

参考文献1 第一章 概述 组成 计算机系统由硬件子系统和软件子系统组成。硬件子系统:组成计算机系统的所有电子的,机械的,光学的和磁性的元部件。 计算机中常用进制数表示 十进制(Decimal):数据尾部加一后缀D,如2355D二进制&a…

nginx配置挂载html

目标 很多软件的官方文档,在国内打开很慢,每次都得等很久,看到官方同时提供了html的包,所以想着挂载到本地nginx下,查看会方便很多。 下载官方html文档包,解压到documentation_htmls下 想添加新的文档也是…

Golang基础3-函数、nil相关

函数 需要声明原型支持不定参数 func sum(numbers ...int)int支持返回多值支持递归支持命名返回参数 // 命名返回参数 func add(a, b int) (sum int) {sum a breturn // 这里不需要显式地写出返回值,因为已经在函数签名中声明了命名返回参数 } 支持匿名函数、闭包…

面试十七、list和deque

一、 Deque Deque容器是连续的空间,至少逻辑上看来如此,连续现行空间总是令我们联想到array和vector,array无法成长,vector虽可成长,却只能向尾端成长,而且其成长其实是一个假象,事实上(1) 申请更大空间 (…

快速理解Laravel容器(IOC、DI、Provider、Contract)

源码理解思维的提升 分享一些个人见解。 Laravel里面的某些概念,就像魔术一样,看起来很厉害,当知道魔术怎么变的,就会认为也不过如此。所以不必感觉Laravel里有些概念难以理解。 应当抛除被框架约束思维的枷锁,用PHP…