【深度学习】S1 预备知识 P1 张量

2024-02-13 07:52

本文主要是介绍【深度学习】S1 预备知识 P1 张量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 张量
  • 创建第一个张量
    • 张量的下载与引入
    • 创建第一个张量
  • 张量的大小和形状
    • 张量的形状
    • 张量的大小
  • 改变张量的形状
  • 创建特殊张量
  • 张量的基本运算
    • 按元素运算
    • 张量连结
    • 逻辑运算
    • 张量求和
  • 张量的广播机制
  • 张量的索引与切片
    • 索引、切片访问张量
    • 通过切片方式节省内存占用
  • 张量转换为其他对象

张量

张量(Tensor)是深度学习中用于表示和处理多维数据的数据结构。张量与 Numpy 类似,但是不同的是深度学习框架专门为张量提供了丰富的操作API,包括创建张量、数据转换、数学运算、索引和切片等,使张量可以使用 GPU 加速,大大提高处理大量数据时的计算速度;同时提供自动微分 Autograd,自动计算和应用梯度。

简单的说,张量(Tensor)就是为深度学习框架量身定制的数据结构。使用张量,深度学习在处理数据和模型计算上更加方便和高效。


创建第一个张量

张量的下载与引入

张量是深度学习框架的数据结构,读者首先需要选择一种深度学习框架(TensorFlow、PyTorch…)并下载,本博文基于 PyTorch 深度学习框架。

  1. 下载 PyTorch 框架:
# 首先下载PyTorch框架
pip install torch==1.12.0
pip install torchvision==0.13.0
# 本bash执行于Anaconda Prompt
  1. 引入 Tensor 张量:
# 建议读者使用PyCharm或者VSCode IDE工具
import torch

创建第一个张量

第一个张量我们使用 arange 创建一个行向量 x:

x = torch.arange(12)
print(x)
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

x 为创建的包含 12 个整数元素的张量。


张量的大小和形状

张量的形状

通过张量的 shape 属性来访问张量的形状。

print(x.shape)
torch.Size([12])

张量的大小

如果只想知道张量中元素的数量,可以使用 numel() 函数。

print(x.numel())
12

改变张量的形状

如果只想改变张量的形状而不改变张量元素数量和值,可以通过使用 reshape() 函数。

y = x.reshape(3,4)
print(y)
tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])

把张量x从形状(12,)的行向量转换为形状为(3,4)的矩阵y。新的张量形状发生改变,但是元素值并没有改变。

张量的转换也支持自动计算维度的功能,比如:

# 下列 z_1, z_2 张量同上述 reshape(3, 4) 函数功能
z_1 = x.reshape(-1, 4)
z_2 = x.reshape(3, -1)

创建特殊张量

有时,我们希望创建全0、全1张量,或者从特定随机分布中随机采样的数字来初始化矩阵,如下。

创建全 0 张量:

# 创建一个形状为 (2, 3, 4) 、值全部为 0 的三维张量
import torch
x_1 = torch.zeros(2,3,4)
print(x_1)
tensor([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])

创建全 1 张量:

import torch
x_2 = torch.ones(2,3,4)
print(x_2)
print(x_2.shape)
tensor([[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]],[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]])
torch.Size([2, 3, 4])

创建正态分布随机采样张量:
创建一个形状为(3,4)的张量,其中每个元素从均值为 0, 标准差为 1 的标准高斯分布中随机采样。

import torch
x = torch.randn(3,4)
print(x)
tensor([[ 0.8532, -0.9053, -0.6921,  0.9674],[-0.8108, -1.4881, -0.0434,  0.1967],[-1.7507, -0.4498,  1.3718, -0.6994]])

张量的基本运算

按元素运算

数学运算中最常见的标准算数运算符(+,-,*,/和**)。将两个张量数组作为输入,按元素运算将二元运算符应用于两个数组中的每对位置对应的元素:

import torchx = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print("x+y=", x+y, "\nx-y=", x-y, "\nx*y=", x*y, "\nx/y=", x/y, "\nx**y=", x**y)
x+y= tensor([ 3.,  4.,  6., 10.]) 
x-y= tensor([-1.,  0.,  2.,  6.]) 
x*y= tensor([ 2.,  4.,  8., 16.]) 
x/y= tensor([0.5000, 1.0000, 2.0000, 4.0000]) 
x**y= tensor([ 1.,  4., 16., 64.])

按元素计算很重要的一点就是两个张量的形状 shape 必须相同,否则将因找不到对应位置的张量从而无法计算。

张量连结

除了按元素计算外,还可以将多个张量连结在一起 cat(tensors, dim=),端对端叠起来形成更大的张量。

import torchx = torch.arange(12).reshape(3, 4)
y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(torch.cat((x,y), dim=1))

将张量 x(3,4)与张量 y(3,4)横向连结形成更大的张量,形状(3,8)。

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.]])

dim=0 的连结结果将为形状(6,4)。

逻辑运算

通过逻辑运算构建张量,对于两个张量的每个位置,如果对照位置相同,则对应位置值为 True,否则为 False;

import torchx = torch.arange(12).reshape(3, 4)
y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])print("x:", x)
print("y:", y)
print("x==y:", x==y)
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.]])
x==y: tensor([[False,  True, False,  True],[False, False, False, False],[False, False, False, False]])

张量求和

如果想对张量中所有元素进行求和,使用 sum() 函数;

print("x:", x)
print(x.sum())
x: tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
tensor(66)

张量的广播机制

在上述张量的基本运算中,我们很多操作都规定需要两个张量保持相同的形状才能完成运算。但是在广播机制中,则不同。张量的广播机制用于扩展张量,虽然不要求两个向量完全相同,但是要求两个向量要分别满足形状:(x, y)与(y, z)方才可以进行运算。

e . g . e.g. e.g.

import torcha = torch.arange(3).reshape(3, 1)
b = torch.arange(2).reshape(1, 2)print("a=", a)
print("b=", b)
print("a+b=", a+b)
print("a*b=", a*b)
a= tensor([[0],[1],[2]])
b= tensor([[0, 1]])
a+b= tensor([[0, 1],[1, 2],[2, 3]])
a*b= tensor([[0, 0],[0, 1],[0, 2]])

上述张量的广播机制操作中,我们将张量 a(3,1)与张量 b(1,2)广播扩展为一个更大的张量,形状(3,2)。


张量的索引与切片

索引、切片访问张量

如 Python 中数组一样,张量中的元素支持通过索引访问。与其他数组一样,张量中第一个元素的索引值为 0,最后一个元素的索引值为 -1。

import torchx = torch.arange(12)
print("x=", x)
print("x[0]=", x[0], "\nx[-1]=", x[-1])
# 通过切片方式访问张量中的元素值
print("x[1:3]=", x[1:3])
x= tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
x[0]= tensor(0) 
x[-1]= tensor(11)
x[1:3]= tensor([1, 2])

当然张量的操作支持通过索引改变其中元素的值;

import torchx = torch.arange(12)
print(x)
x[-2] = 22
print(x)
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 22, 11])

通过切片方式节省内存占用

在张量中,运行一些操作可能会导致需要为新结果分配内存。在深度学习框架张量中,我们可以通过 id() 函数来访问一个张量占用内存的物理位置。

import torchx = torch.arange(12)
print(id(x))
x = x + 1
print(id(x))
2606440820144
2606440818944

打印发展张量 x 在计算前后更换了占用的内存位置,或者说,新计算后为张量 x 新分配了内存空间存储其结果。

这种新分配内存空间不仅产生了不必要的内存占用,还会因为其他引用旧的内存位置导致出错。为了避免这种错误,通过切片方式原地更新;

import torchx = torch.arange(12)
print(id(x))
x[:] = x + 1
print(id(x))
2296319225264
2296319225264

观察发现,运算前后占用的内存地址空间相同。


张量转换为其他对象

Torch 张量与 Numpy 数组共享底层内存,可以就地操作转换;

张量转换为数组:
a.item(), float(a), int(a)

import torcha = torch.arange(12)
b = a.numpy()
print(type(a), type(int(a[1])), type(b))
<class 'torch.Tensor'> <class 'int'> <class 'numpy.ndarray'>

数组转换为张量:

import numpy as np
import torchx = np.arange(12)
y = torch.tensor(x)
print(type(x), type(y))
<class 'numpy.ndarray'> <class 'torch.Tensor'>

以上内存便是预备知识的第一部分张量的相关介绍;
如有任何问题,请联系或者留言;

2024.2.12

这篇关于【深度学习】S1 预备知识 P1 张量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704945

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识