【深度学习】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

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

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

相关文章

Stable Diffusion 模型下载:majicMIX fantasy 麦橘幻想

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

STM32自学☞PWM驱动舵机(按键控制)

PWM.c文件 #include "stm32f10x.h" /*初始化函数*/ void PWM_Init(void){ /*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ G…

洛谷:P1331 海战

题目描述 在一个方形的盘上&#xff0c;放置了固定数量和形状的船只&#xff0c;每只船却不能碰到其它的船。在本题中&#xff0c;我们认为船是方形的&#xff0c;所有的船只都是由图形组成的方形。 求出该棋盘上放置的船只的总数。 输入格式 第一行为两个整数 R 和 C&…

LeetCode1143. Longest Common Subsequence——动态规划

文章目录 一、题目二、题解 一、题目 Given two strings text1 and text2, return the length of their longest common subsequence. If there is no common subsequence, return 0. A subsequence of a string is a new string generated from the original string with so…

【Web】Redis未授权访问漏洞学习笔记

目录 简介 靶机配置 Redis持久化 Redis动态修改配置 webshell 反弹shell Redis写入反弹shell任务 加固方案 简介 Redis&#xff08;Remote Dictionary Server 远程字典服务器&#xff09;是一个开源的内存数据库&#xff0c;也被称为数据结构服务器&#xff0c;它支持…

Ubuntu Desktop 打开和关闭 Terminal

Ubuntu Desktop 打开和关闭 Terminal 1. 打开 Terminal 快捷键2. Search your computer -> Terminal -> Lock to Launcher3. 关闭 Terminal 快捷键References 1. 打开 Terminal 快捷键 Ctrl Alt T 2. Search your computer -> Terminal -> Lock to Launcher 3…

SCI论文作图规范

SCI论文作图规范包括以下几个方面&#xff1a; 一、图片格式 SCI论文通常接受的图片格式包括TIFF、EPS和PDF等。其中&#xff0c;TIFF格式是一种高质量的图像格式&#xff0c;适用于需要高分辨率和颜色准确性的图片&#xff1b;EPS格式是一种矢量图形格式&#xff0c;适用于需…

【深度学习】S1 预备知识 P2 数据预处理

目录 准备工作创建数据集读取数据集处理缺失值处理连续数据缺失值处理离散数据缺失值 转换为张量格式 在应用深度学习技术解决实际问题时&#xff0c;数据的预处理步骤至关重要。在 Python 的各种数据分析工具中&#xff0c;我们选择了 pandas 库来进行这一工作&#xff0c;因为…

力扣:376. 摆动序列

解题思路&#xff1a; 1.先规定好左坡值和右坡值&#xff0c;在计算当前节点比上一节点 的差值。如果左坡值>0且右坡值<0或者 左坡值<0且右坡值>0,符合摆动序列的条件sum加一&#xff0c;同时把右坡值的差值赋值个左坡值&#xff0c;这样就不断在更新左坡值的差值…

位运算+leetcode ( 2 )

题一&#xff1a;只出现一次的数字&#xff08;1&#xff09; 1.链接 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 2.思想 借用位运算中异或操作符的特点&#xff0c;a^a0&#xff0c;0^aa先定义一个sum0就用一个循环来遍历这个数组&#xff0c;每次都进行…

Google Cloud 2024 年报告重点介绍了关键的网络威胁和防御

Google Cloud 的 2024 年威胁范围报告预测了云安全的主要风险&#xff0c;并提出了加强防御的策略。 该报告由 Google 安全专家撰写&#xff0c;为寻求预测和应对不断变化的网络安全威胁的云客户提供了宝贵的资源。 该报告强调&#xff0c;凭证滥用、加密货币挖矿、勒索软件和…

GO 的 Web 开发系列(五)—— 使用 Swagger 生成一份好看的接口文档

经过前面的文章&#xff0c;已经完成了 Web 系统基础功能的搭建&#xff0c;也实现了 API 接口、HTML 模板渲染等功能。接下来要做的就是使用 Swagger 工具&#xff0c;为这些 Api 接口生成一份好看的接口文档。 一、写注释 注释是 Swagger 的灵魂&#xff0c;Swagger 是通过…

C++ 广度优先搜索(bfs)(五十四)【第一篇】

今天我们来学习一下一个新的搜索&#xff0c;广度优先搜索。 1.广度优先搜索的前提 队列&#xff08;queue&#xff09; 是一种 操作受限制 的线性表&#xff0c;其限制&#xff1a; 只允许从表的前端&#xff08;front&#xff09;进行删除操作&#xff1b; 只允许在表的后端…

嵌入式Qt Qt 中的坐标系统

一.Qt中的坐标系统 实验1&#xff1a;窗口坐标大小 #include <QtGui/QApplication> #include <QPushButton> #include <QDebug> #include "widget.h" int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();qDebug()&…

[JavaWeb玩耍日记]Maven的安装与使用

目录 一.作用 二.安装 三.使用 2.对项目使用compile命令进行编译,看看新的文件会在哪里产生&#xff1f; 3.需要认识的命令 4.Maven对项目执行不同命令的生命周期特点&#xff1f; 5.如何导入工程外的Maven&#xff1f; 6.如何直观地查看Maven导入了哪些工程或哪些jar包…

蓝桥杯嵌入式第六届真题(完成)STM32G431

蓝桥杯嵌入式第六届真题&#xff08;完成&#xff09;STM32G431 题目部分 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program b…

LeetCode:69.x的平方根

嗨嗨嗨&#xff0c;二分又来了&#xff0c;淦它&#xff0c; 这个题官解是&#xff0c;C函数法&#xff0c;二分&#xff0c;和牛顿迭代法&#xff08;暂且搁置&#xff09;&#xff0c; 当然还有暴力&#xff08;不必讨论&#xff0c;就从0开始一个一个试&#xff09;&#…

Spring Security 弃用 WebSecurityConfigurerAdapter 重写登录接口

springboot 版本高于 2.7 之后 弃用了 WebSecurityConfigurerAdapter 推荐使用组件化配置安全组件。 原版本的2.7版本的登录接口 功能&#xff1a; 通过/api/doLogin 进行登录 package cn.devops.config;import cn.devops.model.User; import cn.devops.response.RespBe…

Git 消除对某个文件的追踪

参考&#xff1a; &#xff08;尚未验证他的该方法&#xff09; https://www.golinuxcloud.com/git-remove-file-from-tracking/https://www.golinuxcloud.com/git-remove-file-from-tracking/

计网day1

RTT&#xff1a;往返传播时延&#xff08;越大&#xff0c;游戏延迟&#xff09; 一.算机网络概念 网络&#xff1a;网样的东西&#xff0c;网状系统 计算机网络&#xff1a;是一个将分散得、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功…