深度学习pytorch——基本数据类型创建Tensor(持续更新)

声明:本深度学习笔记基于课时18 索引与切片-1_哔哩哔哩_bilibili学习而来

All is about Tensor

定义:Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars and vectors. In fact tensors are merely a generalisation of scalars and vectors; a scalar is a zero rank tensor, and a vector is a first rank tensor.

这句话的大概意思就是张量就是标量和向量的推广,标量被称为0维张量,向量被称为一维张量。

我们先将python常用的数据类型和pytorch进行比较,我们可以很清楚的看出pytorch的数据类型都加了一个张量(Tensor),但是pytorch里面并没有字符串类型,因为pytorch主要是一个关于计算的库。

但是,我们在pytorch里面就用不到字符串吗?当让不是,在数字识别体验课的时候我们是用了One-hot的编码方式,就是我们创建一个长度为10的一维向量,如果对应上了,我们就把与此对应的数值改为1。

 问题又来了,我们需要处理的数据太过庞大了,比如我们处理10万个数据,我们还要使用长度为10万的向量吗?答案,肯定不是。我们使用叫做Embedding的编码方式。

总的来说,就是讲pytorch使用编码的方式处理字符串

再回到我们的数据类型上:

我们在pytorch上使用torch.FloatTensor表示浮点型,其它类型同理。众所周知,深度学习需要处理大量的数据,需要大量的计算,为了提高效率,我们让GPU帮助我们计算,但是此时数据类型就要加上cuda了。

Type check

import torch
a = torch.randn(2,3)                # 创建一个2*3矩阵

print("Tensor:",a)
# 输出:Tensor: tensor([[-0.6643, -1.7207, -0.7312],
#        [-0.9627, -0.5519, -0.7359]])

print("Tensor of type:",a.type())
# 输出:Tensor of type: torch.FloatTensor

# 在深度学习中,我们经常会用到参数的合理化检验,一般使用下面这个方法
isinstance(a,torch.FloatTensor)
# 输出:Ture

# 不常使用的
# print(type(a))

再讲述一下pytorch默认类型的问题,以及设置默认类型的问题:

pytorch中使用tensor创建的张量默认类型为双精度类型

print(torch.tensor([1.2,3]).type())
# out:torch.DoubleTensor
# 设置默认类型:
torch.set_default_tensor_type(torch.FloatTensor)
print(torch.tensor([1.2,3]).type())
# out:torch.FloatTensor

dim

 注:tensor里面包含的就是具体的数据。

size()&shape&dim()

我觉得进行下面的学习之前,应该先搞明白size,shape,dim的概念。

shape是一个属性,在使用的时候不用加括号;size()是一个方法。其实shape和size()的作用是一样的,但是shape是numpy中array和pytorch中的tensor通用的size()只能用在tensor上。

dim()方法是计算维度的,效果和len(a.shape)一样。

a = torch.tensor([[1,2,3,0],[4,5,7,9],[7,8,5,3]])
print("shape:",a.shape)
# out:shape: torch.Size([3, 4])
print("dim:",a.dim())
# out:dim: 2
print("size:",a.size())
# out:size: torch.Size([3, 4])

 创建Tensor

1、import from numpy

# 创建Tensor
# eg1
import numpy as np
a = np.array([2,3.3])           # 先使用numpy创建dim 1  size 2 的向量
print(torch.from_numpy(a))      # 导入 
# out:tensor([2.0000, 3.3000])
#eg2
a = np.ones([2,3])              # 先使用np直接创建一个维度为2,size为3的向量
print(torch.from_numpy(a))
# out:tensor([[1., 1., 1.],
#         [1., 1., 1.]])

2、import from List

当时数据量不是很大的时候就可以使用此方法。直接使用List方法tensor接受现有数据,Tensor接受数据的维度,也可以接受现有数据。

print(torch.tensor([2.,3.2]))
# out:tensor([2.0000, 3.3000])
print(torch.tensor([[2.,3.2],[1.,22.369]]))
# out:tensor([[ 2.0000,  3.2000],
#         [ 1.0000, 22.3690]])
print(torch.FloatTensor([2.,3.2]))              # 接收数据
# out:tensor([2.0000, 3.3000])
print(torch.FloatTensor(2,3))                   # 接受维度
# out:tensor([[-2.9315e-03,  1.0272e-42, -1.5882e-23],
#         [ 2.1500e+00,  0.0000e+00,  1.8750e+00]], dtype=torch.float32)
print(torch.Tensor([2.,3.2]))
# out:tensor([2.0000, 3.3000])

但是一般在使用的时候会使用 tensor专门接受现有数据,Tensor专门接受数据的维度,这样不容易搞混。

3、uninitialized

当需要未初始化数据的时候可以使用以下几种方法。

# 以下方法生成的数据非常的不规律,需要使用数据进行覆盖
print(torch.empty(2))              # 生成一个未初始化长度为1的数据
# out:tensor([1.2697e-321, 4.9407e-324])
print(torch.Tensor(2,3))
# out:tensor([[4.9407e-324, 4.9407e-324, 4.9407e-324],
#         [4.9407e-324, 4.9407e-324, 4.9407e-324]])
print(torch.IntTensor(2,3))
# out:tensor([[-1153427456,         733,   -81441600],
#         [ 1072143930,  -588085446,  1071206672]], dtype=torch.int32)
print(torch.FloatTensor(2,3))
# out:tensor([[-2.9309e-03,  1.0272e-42, -8.5829e+35],
#         [ 1.8095e+00, -5.4613e+17,  1.6978e+00]], dtype=torch.float32)

4、rand/rand_like,randint

随机初始化,也是推荐最常使用的。

print(torch.rand(3,3))              # rand()方法随机产生0-1的数据,此时产生一个3*3的二维张量(第一维长度为3,第二维长度为3)
# out:tensor([[0.0664, 0.6562, 0.3293],
#         [0.4063, 0.8417, 0.0114],
#         [0.0279, 0.3318, 0.5429]])
a = torch.rand(3,3)
print(torch.rand_like(a))           # 作用:接受的是一个shape,会将a的shape直接读出来,再传入rand()方法
# out:tensor([[0.5812, 0.8895, 0.3767],
#         [0.3151, 0.2174, 0.5673],
#         [0.4537, 0.9913, 0.7640]])
print(torch.randint(1,10,[3,3]))    # randint()方法只能随机产生整数,此时产生一个所有元素都位于1-10的3*3的二维张量
# out:tensor([[7, 1, 3],
#         [2, 2, 8],
#         [2, 8, 6]])

如果想要均匀采样0-10的tensor,要使用x = 10*torch.rand(d1,d2),randint()只能采样整数。 

5、randn

会产生正态0,1分布的随机数。

print(torch.randn(3,3))
# out:tensor([[ 0.9438,  0.8224, -0.9046],
#         [-0.0314,  1.2954, -0.6943],
#         [ 1.0301, -0.3824, -1.0747]])
print(torch.normal(mean=torch.full([10],0.), std=torch.arange(1,0,-0.1)))
# out:tensor([-0.4060, -0.5174,  0.1747, -0.7274, -0.0309,  0.4580, -0.6965, -0.2976,
#         -0.1198,  0.0581])

normal(mean, std, *, generator=None, out=None)

返回值:一个张量,张量中每个元素是从相互独立的正态分布中随机生成的。每个正态分布的均值和标准差对应着mean中的一个值和std中的一个值。

注意:张量mean和std的形状不一定相同,但是元素个数必须相同。如果二者形状不一致,返回张量的形状和mean的一致

generator=None:用于采样的伪随机数发生器

out:输出张量的形状

6、full

print(torch.full([2,3],7))      # 创建一个全为7的2*3二维向量
# out:tensor([[7, 7, 7],
#         [7, 7, 7]])
print(torch.full([],7))         # 创建一个全为7的标量
# out:tensor(7)
print(torch.full([2],7))        # 创建一个全为7的1*2一维向量
# out:tensor([7, 7])

7、arange/range

生成递增、递减等差数列的API。

print(torch.arange(0,10))       # 生成一个从0开始,不到10的等差数列
# out:tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(torch.arange(0,10,2))
# out:tensor([0, 2, 4, 6, 8])
print(torch.range(0,10))        # 不推荐使用这个
# out:tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
# C:\Users\Lenovo\AppData\Local\Temp\ipykernel_10204\2132562954.py:3: UserWarning: torch.range is deprecated and will be removed in a future release because its behavior is inconsistent with Python's range builtin. Instead, use torch.arange, which produces values in [start, end).
#   print(torch.range(0,10))

8、linspace/logspace

生成一个等差的数列。

print(torch.linspace(0,10,steps=4))         # 后面的数是指生成元素的个数
# out:tensor([ 0.0000,  3.3333,  6.6667, 10.0000])
print(torch.linspace(0,10,steps=10))
# out:tensor([ 0.0000,  1.1111,  2.2222,  3.3333,  4.4444,  5.5556,  6.6667,  7.7778,
#          8.8889, 10.0000])
print(torch.linspace(0,10,steps=11))
# out:tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
print(torch.logspace(0,-1,steps=10))        # 生成10个10的0次方到10的-1次方的数
# out:tensor([1.0000, 0.7743, 0.5995, 0.4642, 0.3594, 0.2783, 0.2154, 0.1668, 0.1292,
#         0.1000])
print(torch.logspace(0,1,steps=10))
# out:tensor([ 1.0000,  1.2915,  1.6681,  2.1544,  2.7826,  3.5938,  4.6416,  5.9948,
#          7.7426, 10.0000])

9、Ones/zeros/eye

生成全0,全1,是对角矩阵的。

print(torch.ones(3,3))      # 生成一个全一3*3的二维张量
# out:tensor([[1., 1., 1.],
#              [1., 1., 1.],
#              [1., 1., 1.]])
print(torch.zeros(3,3))     # 生成一个全零3*3的二维张量
# out:tensor([[0., 0., 0.],
#             [0., 0., 0.],
#             [0., 0., 0.]])
print(torch.eye(3,4))       # 生成一个近似对角矩阵
# out:tensor([[1., 0., 0., 0.],
#         [0., 1., 0., 0.],
#         [0., 0., 1., 0.]])
print(torch.eye(3))         # 生成一个对角矩阵
# out:tensor([[1., 0., 0.],
#         [0., 1., 0.],
#         [0., 0., 1.]])
a=torch.zeros(3,3)
print(torch.ones_like(a))
# out:tensor([[1., 1., 1.],
#         [1., 1., 1.],
#         [1., 1., 1.]])

10、randperm

随机打散

print(torch.randperm(10))       # 随机生成一个0-9长度为10的索引
a=torch.rand(2,3)
b=torch.rand(2,2)
idx=torch.randperm(2)
print(idx)
print(idx)
print(a[idx])                   # 这个必须和下面一句idx保持一致
print(b[idx])
print(a,b)

补充

如果a=tensor([[[0.0787, 0.8906, 0.0690], [0.1323, 0.5660, 0.2708]]]),a[0] = tensor([[0.0787, 0.8906, 0.0690], [0.1323, 0.5660, 0.2708]]),获取a中第0个元素,就是第一维度的第0个元素;a[0][0]=tensor([0.0787, 0.8906, 0.0690]),获取a中第二维度的第0个元素的第0个元素。

a = torch.randn(2,3)
print(a)
# out:tensor([[ 1.7312,  1.8919,  0.3483],
#         [ 0.6409,  1.5857, -1.4704]])
print(a.shape)          # 获取tensor的具体形状
# out:torch.Size([2, 3])
print(a.size(0))        # 获取shape的第0个元素
# out:2
print(a.size(1))        # 获取shape的第1个元素
# out:3
print(a.shape[1])       # 获取shape的第1个元素,但是注意括号的区别
# out:3
tensorData.numel()  # 具体占用内存大小

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

地址转换函数(ip地址在计算中的识别方式,ipv4与ipv6)

ip地址在计算中的识别方式 ip地址如192.168.3.103是字符串 在计算机中该字符串ip用整型保存并识别。 ipv4与ipv6 ipv4 有四组,每组一个字节,一共4x832位 ipv4一共有 2^32 42 9496 7296 个地址。 ipv6 IPv6是由八组,每组四位16进制数字…

Java:设计模式

文章目录 参考简介工厂模式简单工厂模式工厂方法模式抽象工厂模式总结 单例模式预加载懒加载线程安全问题 策略模式 参考 知乎 简介 总体来说设计模式分为三类共23种。 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模…

【晴问算法】入门篇—贪心算法—区间选点问题

题目描述 给定n个闭区间,问最少需要确定多少个点,才能使每个闭区间中都至少存在一个点。 输入描述 输出描述 输出一个整数,表示最少需要确定的点的个数。 样例1输入 3 1 4 2 6 5 7输出 2 解释 至少需要两个点(例如3和5&#xff…

Java基础夯实【进阶】——八股文【2024面试题案例代码】

1、Java当中什么是线程和进程 在Java中,线程和进程是两个非常重要的概念。进程可以被视为一个执行中的程序的实例,它拥有自己的内存空间和系统资源。而线程则是进程中的一个实体,由进程创建,并允许程序在同一时刻执行多个任务。J…

Jenkins实现CICD(4)_Jenkins和gitlab进行交互

文章目录 一、实现功能二、操作思路三、插件安装四、jenkins与gitlab集成配置2.1、需求2.2、gitlab生成 API认证token2.2.1、创建token 2.3、jenkins使用gitlab API通信2.3.1、创建凭据2.3.2、查看创建结果 2.4、jenkins 集成 Gitlab2.4.1、配置2.4.2、操作流程 参考&#xff1…

XDAG节点版本更新(0.6.5升级到0.7.0)

1、拉取最新的xdagj源码 mkdir /root/xdagj-0.7.0 && cd /root/xdagj-0.7.0 git clone https://github.com/XDagger/xdagj.git cd xdagj mvn clean package -Dmaven.test.skiptrue2、创建新的数据目录并解压程序包 mkdir /data/docker-compose/xdagj-7.0/bin -p cd /…

Linux使用git命令行教程

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 git安装git仓库的创建.git 文件添加文件git 三板斧(add,commit,push)解释拓展git log.gitignore git安装 首先输入git --version看看有没有安装git 如…

STM32F4+薄膜压力传感器(FSR)AO模拟输出程序ADC模数转换器详解

前言:博主在使用STM32F4加薄膜压力传感器用来测量压力时,发现给的例程只有STM32F1系列的,而STM32F4系列库函数程序不太一致,博主实战解决了该问题,用STM32F4标准库开发。有关ADC模数转换器的详细知识点详情点击我的博文…

【深度长文】聊一聊 Java AbstractQueuedSynchronizer 以及在 ReentrantLock 中的应用

文章目录 AQS 原理简述内部数据结构公平锁 vs. 非公平锁ReentrantLock 非公平锁ReentrantLock 公平锁 AQS 源码分析加锁过程addWaiteracquireQueuedshouldParkAfterFailedAcquirecancelAcquire 解锁过程unparkSuccessor AbstractQueuedSynchronizer (AQS) 是 Java 并发包中&…

【AUTOSAR】【通信栈】Fls

AUTOSAR专栏——总目录-CSDN博客文章浏览阅读592次。本文主要汇总该专栏文章,以方便各位读者阅读。https://blog.csdn.net/qq_42357877/article/details/132072415?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132072415%22…

【电路笔记】-MOSFET作为开关

MOSFET 作为开关 文章目录 MOSFET 作为开关1、概述2、MOSFET特性曲线2.1 截住区域2.2 饱和区域3、MOSFET作为开关的示例4、功率MOSFET电机控制5、P沟道MOSFET作为开关6、互补MOSFET作为开关电机控制器当 MOSFET 在截止区和饱和区之间工作时,MOSFET 是非常好的电子开关,用于控…

RK3588 Buildroot 增加本地模块(单独编译/加入系统配置)

前言 本文基于 RK3588 Buildroot 编写. 在RK3588开发板环境下,开发者通常利用Buildroot来定制适合RK3588芯片特性的嵌入式Linux系统。通过Buildroot,开发者能够根据实际需求裁剪系统组件、添加特定驱动、配置内核特性,并集成用户应用程序&a…

哪里有视频素材网站免费下载?高清烟花视频素材哪里有?

如果你在寻找那些能点亮夜空的绚丽烟花视频素材,或者无水印的高清视频素材,那下面这些资源网站将会是你的宝库。今天,我要分享给你一些最佳的无水印视频素材下载网站,让你的视频制作闪耀起来。 1.蛙学府 这个网站是视频创作者的天…

C++之入门一

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

网安渗透攻击作业(4)

Unload-labs-01 function checkFile() { var file document.getElementsByName(upload_file)[0].value; if (file null || file "") { alert("请选择要上传的文件!"); return false; } //定义允许上传的文件类型 v…

PHP反序列化--引用

一、引用的理解&#xff1a; 引用就是给予一个变量一个恒定的别名。 int a 10; int b &a; a 20; cout<<a<<b<<endl; 输出结果 : a20、b20 二、靶场复现&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); include("flag.p…

10大漏洞评估和渗透测试工具【附安装包】

1、Netsparker Security Scanner 专为企业设计的强大的漏洞扫描和管理工具&#xff0c;它可以检测和利用 SQL 注入和 XSS 等漏洞。 https://www.netsparker.com/product/ 2、Acunetix Scanner 针对中小型企业的 Web 应用程序漏洞扫描程序&#xff0c;但也可以扩展到更大的组…

Jenkins实现CICD(3)_Jenkins连接到git

文章目录 1、如何完成上述操作&#xff0c;并且不报如下错&#xff1a;2、连接不上git&#xff0c;操作如下&#xff1a;3、将上边产生的3个文件拷贝到&#xff1a;C:\Windows\System32\config\systemprofile\.ssh4、新建下图凭证&#xff1a;创建步骤&#xff1a; 5、公钥填到…

搜索练习(地下城主,查找倍数)

地下城主 思路&#xff1a;这个其实就是bfs的板子&#xff0c;但是和以往的bfs不同&#xff0c;这个bfs适用于三维空间&#xff0c;也就是说多出一维需要进行搜索&#xff1a; 犯下的错误&#xff1a;在bfs的输出中我写成了cout<<q[tail].step1<<endl; 由于在之前…

机器人路径规划:基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(提供Python代码)

流场寻路算法(Flow Field Pathfinding)是一种基于流体动力学理论的路径规划算法&#xff0c;它模拟了流体在空间中的流动&#xff0c;并利用流体的运动特性来指导路径的选择。下面是流场寻路算法的基本介绍及算法描述&#xff1a; 1. 基本介绍 流场寻路算法通过将环境划分为网…