深度学习笔记-1.基本的数据操作

news2025/7/13 1:33:10

数据的基本操作

        • 1-tensor创建
        • 2-功能函数
        • 3-算术操作
        • 4-数据操作
          • 4_1. index_select
          • 4_2. masked_select
          • 4_3. torch.nonzero
          • 4_4. torch.gather
          • 4_5. view
        • 5-线性函数
        • 6-Tensor与Numpy相互转换
          • 6_1. broadcasting
          • 6_2. 内存机制
          • 6_3. 自动梯度求导

在深度学习中,我们通常会频繁地对数据进行操作。作为动手学深度学习的基础,掌握对内存中数据的处理,以及一些函数的掌握很有必要,本章是开篇对深度学习的Pytorch版本的学习与记录,原书是李沐 MXNet版本《动手学深度学习》,!


1-tensor创建

Tensor和NumPy的多维数组非常类似
"tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量.

import torch

x=torch.empty(5,3)#创建一个5x3的未初始化的Tensor
print(x)
#tensor([[2.8035e+10, 5.6332e-43, 2.8035e+10],
#        [5.6332e-43, 2.8035e+10, 5.6332e-43],
#        [2.8035e+10, 5.6332e-43, 2.8035e+10],
#        [5.6332e-43, 2.8035e+10, 5.6332e-43],
#        [2.8035e+10, 5.6332e-43, 2.8035e+10]])

x=torch.rand(5)#返回区间[0, 1) np.random.rand(5)
#tensor([0.2398, 0.4620, 0.0815, 0.1845, 0.7786])

torch.zeros((2,2),dtype=torch.long)#创建一个2x2的long型全0的Tensor: np.zeros((2,2),dtype=np.int8)
#tensor([[0, 0],
#        [0, 0]])
torch.tensor([5.5000, 3.0000])#直接按照数据创建
#tensor([5.5000, 3.0000]

x=x.new_ones(5, 3, dtype=torch.float64)  # 返回的tensor默认具有相同的torch.dtype和torch.device

#返回一个均值为0.方差为1的正态分布的随机数,指定类型为float
torch.randn_like(x, dtype=torch.float) # 指定新的数据类型
# 查看纬度张量大小
x.shape / x.size()

2-功能函数

这些方法在创建的时候可以指定数据类型dtype和存放device(cpu/gpu)

#可以联想Numpy的一些函数,很类似,可以去官方API查阅
ones(size)# 全1,
zeros(size) #全 0,
eye(size) #对角1矩阵,
arrange(s,e,steps) #从s到e,步长为step 类似循环循
linspace(s,e,steps)#从s到e,均匀切分成steps份
rand/randn(*size) #均匀/标准分布
normal(mean,std)/uniform(from,to) ##正态分布/均匀分布
randperm(m) #随机排列 m为int 随机返回[0,m) 

3-算术操作

#加法 x+x1 add(x,x1) add(x,x1,out=torch.empty(size))
y  = torch.tensor([5, 3])
y1 = torch.tensor([4, -1])
print(y+y1)#tensor([9, 2])
print(torch.add(y,y1))#函数tensor([9, 2])
#可以指定输出
result = torch.empty(2)
torch.add(y1, y, out=result)
print(result)

PyTorch操作inplace版本都有后缀_, 例如x.copy_(y), x.t_() 修改原值

y.add_(y1)# y的值从tensor([5, 3])变为tensor([9, 2])
#而y.add(y1) 不修改y的值

4-数据操作

索引可以联想Numpy的用法,索引出来的结果与原数据共享内存,也即修改一个,另一个会跟着修改

#切片的操作 共享内存一起修改
y = x[0, :]
y += 1
print(y)
print(x[0, :]) # 源tensor也被改了 x的0行也修改了
#==>tensor([1.6035, 1.8110, 0.9549])
#   tensor([1.6035, 1.8110, 0.9549])
4_1. index_select

index_select(input,dim.index) 在指定维度dim上选取,比如选取某些行、某些列
切片操作的话的会修改原共享内存,源数据

x=torch.tensor([[ 2.3967,  2.0892,  1.4369],
       			[ 1.6995,  2.0453,  0.6539],
		        [-0.1553,  3.7016, -0.3599]])
		        
##在x 的基础上,0表示按行 选择index 0,2行的数据
torch.index_select(x,0,index=torch.tensor([0,2]))
#tensor([[ 2.3967,  2.0892,  1.4369],
#        [-0.1553,  3.7016, -0.3599]])

#在x 的基础上,1表示按列 选择index 0列,2列的数
torch.index_select(x,1,index=torch.tensor([0,2]))
#tensor([[ 2.3967,  1.4369],
#        [ 1.6995,  0.6539],
#        [-0.1553, -0.3599]])
4_2. masked_select

masked_select(input, mask) mask的类似于过滤的操作 df[df.age>0] mask 有四种类型:torch.ge(input, other, out=None) → Tensor ------input>=other
torch.gt (input, other, out=None) → Tensor ------input>other
torch.le (input, other, out=None) → Tensor ------input<=other
torch.lt (input, other, out=None) → Tensor ------input<other
other 可以是一个数也可以是一个与input 同类型的张量,输出一个bool形的张量。

x.ge(1)#筛选大于1的数据 生成bool true or False
torch.masked_select(x,x.ge(1))#筛选大于1的数据
#==>tensor([1.6035, 1.8110, 1.0482, 2.8663, 1.0739, 2.2628])
4_3. torch.nonzero

帅选非零元素的下标torch.nonzero(x),然后可以通过下标获取元素

4_4. torch.gather

**gather(input, dim, index)**根据index,在dim维度上选取数据,输出的size与index一样
dim=0 length矩阵中的数的值代表的是行数,所处位置代表的是列数。
dim=1 length矩阵中的数的值代表的是列数,所处位置代表的是行数。

x=torch.tensor([[ 2.3967,  2.0892,  1.4369],
        [ 1.6995,  2.0453,  0.6539],
        [-0.1553,  3.7016, -0.3599]])
#dim=0 [[00,01],[10,01]]   index矩阵表示行数  列数表示位置所处的列数
torch.gather(x,0, torch.tensor([[0, 0], [1, 0]]))
#tensor([[2.3967, 2.0892],
#       [1.6995, 2.0892]])

#dim=1 index矩阵的数字表示列数 [[00,00],[11,10]] 01->表示0行1列 行数表示位置所处的行数
torch.gather(x,1, torch.tensor([[0, 0], [1, 0]]))
#tensor([[2.3967, 2.3967],
#        [2.0453, 1.6995]])
4_5. view

用于改变view的形状
注意view()返回的新Tensor与源Tensor虽然可能有不同的size,但是是共享data的,也即更改其中的一个,另外一个也会改变

x.shape# (5,3)
z=x.view(-1,5)#(3,5)
x.view(-1)#(1,15)
z+=1#修改操作  源x 也改变了

用view()会修改源数据,一般会先clone创造一个副本然后再使用view

x_cp = x.clone().view(15)#先用clone创造一个副本然后再使用view  copy
#修改x 不影响x_cp的值
x-=1

item 将一个标量 tensor 转化为number

x = torch.randn(1)
print(x)
print(x.item())

5-线性函数

在这里插入图片描述
支持很多操作如转置、索引、切片、数学运算、线性代数、随机数等等,更多可参考官方文档

6-Tensor与Numpy相互转换

6_1. broadcasting

当对两个形状不同的Tensor按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算

x = torch.arange(1, 3).view(1, 2)
print(x)
y = torch.arange(1, 4).view(3, 1)
print(y)
------------------------------------
==> tensor([[1, 2]])
	tensor([[1],
        [2],
        [3]])

6_2. 内存机制

在这里插入图片描述
还可以使用运算符全名函数中的out参数或者自加运算符+=(也即add_())达到上述效果,例如torch.add(x, y, out=y)和y += x(y.add_(x))

x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
torch.add(x, y, out=y) # y += x, y.add_(x)
print(id(y) == id_before) # True   
print(y)#tensor([4, 6]) 因为共享内存 值改变 

注:虽然view返回的Tensor与源Tensor是共享data的,但是依然是一个新的Tensor(因为Tensor除了包含data外还有一些其他属性),二者id(内存地址)并不一致。

6_3. 自动梯度求导

numpy()from_numpy()TensorNumPy中的数组相互转换。但是需要注意的一点是: 这两个函数所产生的的TensorNumPy中的数组共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变!!!

1-Tensor 转Numpy

import numpy as np

a=torch.ones(5)#tensor([1., 1., 1., 1., 1.])
b=a.numpy()#转numpy  array([1., 1., 1., 1., 1.], dtype=float32)
#执行操作a+=1 or b+=1 都会修改对应的数据
a+=1
print(a,b)#(tensor([2., 2., 2., 2., 2.]), array([2., 2., 2., 2., 2.], dtype=float32))

2-Numpy 数组转 Tensor

a = np.ones(5)#
b = torch.from_numpy(a)
print(a,b)#[1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
#执行操作a+=1 or b+=1 都会修改对应的数据

通过以下方式的不会共享内存。torch.tensor()

c = torch.tensor(a)
a += 1
print(a, c)
#==>[2. 2. 2. 2. 2.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

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

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

相关文章

佩戴舒适真无线蓝牙耳机怎么选?久戴不痛的蓝牙耳机推荐

本身佩戴蓝牙耳机听音乐是一件舒心&#xff0c;非常享受的事情&#xff0c;但是&#xff0c;因为每个人的耳道都不一样&#xff0c;所以有很多人因为佩戴不舒适而选择放弃蓝牙耳机。今天&#xff0c;小编特意给大家搜集了4款公认佩戴最舒适的蓝牙耳机&#xff0c;让佩戴不再成为…

实验6 图像压缩

本次实验大部分素材来源于山大王成优老师的讲义以及冈萨雷斯&#xff08;MATLAB版&#xff09;&#xff0c;仅作个人学习笔记使用&#xff0c;禁止用作商业目的。 文章目录一、实验目的二、实验例题1. 二维离散余弦变换(Discrete Cosine Transform, DCT)的基图像2. JPEG 压缩2.…

扬帆优配|太猛了!最高暴拉170%,港股这一板块狂飙!“带货”起飞?

A股商场和港股商场上午均跌落&#xff0c;不过到上午收盘&#xff0c;A股商场上涨个股数量多于跌落个股。 港股方面&#xff0c;首要指数跌幅较大&#xff0c;但影视传媒股鹤立鸡群&#xff0c;团体大涨。其间&#xff0c;为内地观众所熟知的TVB母公司今天上午股价再度暴升&…

如何搞定MySQL锁(全局锁、表级锁、行级锁)?这篇文章告诉你答案!太TMD详细了!!!

概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&…

文件如何批量复制保存在多个文件夹中

在日常工作中经常需要整理文件&#xff0c;比如像文件或文件夹重命名或文件批量归类&#xff0c;文件批量复制到指定某个或多个文件来中保存备份起来。一般都家最常用方便是手动一个一个去重命名或复制到粘贴到某个文件夹中保存&#xff0c;有没有简单好用的办法呢&#xff0c;…

第九届省赛——8等腰三角形(找规律)

题目&#xff1a;本题目要求你在控制台输出一个由数字组成的等腰三角形。具体的步骤是&#xff1a;1. 先用1,2,3&#xff0c;...的自然数拼一个足够长的串2. 用这个串填充三角形的三条边。从上方顶点开始&#xff0c;逆时针填充。比如&#xff0c;当三角形高度是8时&#xff1a…

【卷积神经网络】激活函数 | Tanh / Sigmoid / ReLU / Leaky ReLU / ELU / SiLU / GeLU

文章目录一、Tanh二、Sigmoid三、ReLU四、Leaky ReLU五、ELU六、SiLU七、Mish本文主要介绍卷积神经网络中常用的激活函数及其各自的优缺点 最简单的激活函数被称为线性激活&#xff0c;其中没有应用任何转换。 一个仅由线性激活函数组成的网络很容易训练&#xff0c;但不能学习…

蓝桥杯C/C++b组第一题个人整理合集(5年真题+模拟题)

蓝桥杯C/Cb组填空第一题合集 前言 比赛标准的签到题&#xff0c;比赛时的第一题。不会考到什么算法&#xff0c;甚至都不需要你打代码。但有时候第一题都没做出来的确是非常挫灭信心 看了看历年题目。很多小陷阱也不少 今年的比赛也正好还有一个月&#xff0c;自己对填空题第…

XCPC第九站———背包问题!

1.01背包问题 我们首先定义一个二维数组f&#xff0c;其中f[i][j]表示在前i个物品中取且总体积不超过j的取法中的最大价值。那么我们如何得到f[i][j]呢&#xff1f;我们运用递推的思想。由于第i个物品只有选和不选两种情况&#xff0c;当不选第i个物品时&#xff0c;f[i][j]f[i…

云计算生态该怎么做?阿里云计算巢打了个样

2023 年 2 月 23 日至 24 日&#xff0c;由阿里云主办的「阿里云计算巢加速器」于杭州阿里云谷园区集结。 阿里云计算巢加速器于 2022 年 8 月正式启动招募&#xff0c;最终百奥利盟、极智嘉、EMQ、KodeRover、MemVerge 等 30 家创新企业入选计算加速器&#xff0c;覆盖了人工智…

16N60-ASEMI高压MOS管16N60

编辑-Z 16N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.2Ω&#xff0c;是一款N沟道高压MOS管。16N60的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。16N60功耗&#xf…

Blazor_WASM之4:路由

Blazor_WASM之4&#xff1a;路由 路由模板 通过 Router组件可在 Blazor 应用中路由到 Razor 组件。 Router 组件在 Blazor 应用的 App 组件中使用。App组件模板如下 <Router AppAssembly"typeof(Program).Assembly"><Found Context"routeData"…

致敬我的C++启蒙老师,跟着他学计算机编程就对了 (文末赠书5本)

致敬我的C启蒙老师&#xff0c;跟着他学计算机编程就对了 摘要 讲述了一个故事&#xff0c;介绍了一位良师&#xff0c;一段因C而续写的回忆&#xff0c;希望对各位看官有所帮助和启发。 文章目录1 写在前面2 我的C启蒙老师3 谈谈老师给我的启发4 友情推荐5 文末福利1 写在前面…

Python 模块之 CSV 读取

1、CSV 文件存储 1.1 写入 简单示例 import csvwith open(data.csv, a) as csvfile:writer csv.writer(csvfile) # 初始化写入对象&#xff0c;传入文件句柄writer.writerow([id, name, age]) # 调用 writerow() 方法传入每行的数据writer.writerow([1, rose, 1…

python安装好了某个包但是仍报错ImportError: No module named xxx的解决方法及思路

这是一个应该比较常见的问题&#xff0c;下面首先讲一下该类问题的一般解决 思路&#xff0c;然后再进行一个自我debug的过程描述。 1 解决思路 出现该问题的根本原因是&#xff0c;当前使用的python环境&#xff0c;和已经安装了包的python环境不是同一个。解决问题一般可以根…

数组、指针总结【面试题】

文章目录0. 补充知识数组笔试题1. 一维数组1.1 字符数组1.1.1 sizeof1.1.2 strlen1.2 二维数组2. 指针笔试题0. 补充知识 在进入数组与指针的练习时&#xff0c;我们先来复习以下以下的知识点&#xff0c;这可以帮助我们更好的理解下面练习 数组是一组能存放相同类型的类型的元…

数据库的查询

数据库的查询 一、知识要点&#xff1a; 1.SELECT语句的一般格式 SELECT [ ALL|DISTINCT ] [TOP N [PERCENT] ] <目标列表达式> [别名] [&#xff0c;<目标列表达式> [别名] ]… FROM <表名或视图名> [ 别名 ][&#xff0c;<表名或视图名> [ 别名 ] ]…

JavaScript DOM API的使用

文章目录一. 什么是DOM二. 最常用的DOM API1. 选中页面元素2. 操作元素的属性2.1 事件概念2.2 获取/修改元素内容计数器2.4 获取/修改元素属性点击图片切换2.5 获取/修改表单元素属性表单计数器全选/取消全选按钮2.6 获取修改样式属性点击文字放大实现夜间/日间模式的切换3. 操…

【C++】反向迭代器

文章目录一、什么是反向迭代器二、STL 源码中反向迭代器的实现三、reverse_iterator 的模拟实现四、vector 和 list 反向迭代器的实现一、什么是反向迭代器 C 中一共有四种迭代器 – iterator、const_iterator、reverse_iterator 以及 const_reverse_iterator&#xff0c;其中…

基层治理四平台解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 省基层治理体系“四个平台”采用“1N"统分结合的建设模式:即统筹建设“1"个浙江政务服务网基层业务协同平台(以下简称“协同平台”)&#xff0c;同步改造、整合、推广“N…