PyTorch张量创建和随机数生成器算法

news2024/9/22 17:23:11

文章目录

  • 1、基本创建方式
    • 1.1、根据已有数据创建张量
    • 1.2、根据已有数据创建张量
    • 1.3、根据已有数据创建张量
  • 2、创建线性和随机张量
    • 2.1、创建线性空间的张量
    • 2.2、创建随机张量
    • 2.3、什么是随机数种子
    • 2.4、initial_seed()和manual_seed()
  • 3、创建01张量
    • 3.1、全0张量
    • 3.2、全1张量
    • 3.3、指定张量
  • 4、张量元素类型转换⭐
  • 5、随机数生成器的算法⭐
    • 5.1、线性同余生成器LCG
    • 5.2、梅森旋转算法
    • 5.3、Xorshift算法
    • 5.4、其他算法

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、基本创建方式

  1. torch.tensor:根据指定数据创建张量
  2. torch.Tensor:根据形状创建张量, 其也可用来创建指定数据的张量
  3. torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量

1.1、根据已有数据创建张量

# 1. 根据已有数据创建张量
def test01():
    # 1. 创建张量标量
    data = torch.tensor(10)
    print(data)
    # 2. numpy 数组, 由于 data 为 float64, 下面代码也使用该类型
    data = np.random.randn(2, 3)
    data = torch.tensor(data)
    print(data)
    # 3. 列表, 下面代码使用默认元素类型 float32
    data = [[10., 20., 30.], [40., 50., 60.]]
    data = torch.tensor(data)
    print(data)

image.png

1.2、根据已有数据创建张量

# 2. 创建指定形状的张量
def test02():
    # 1. 创建2行3列的张量, 默认 dtype 为 float32
    data = torch.Tensor(2, 3)
    print(data)
    # 2. 注意: 如果传递列表, 则创建包含指定元素的张量
    data = torch.Tensor([10])
    print(data)
    data = torch.Tensor([10, 20])
    print(data)

image.png

1.3、根据已有数据创建张量

# 3. 使用具体类型的张量
def test03():
    # 1. 创建2行3列, dtype 为 int32 的张量
    data = torch.IntTensor(2, 3)
    print(data)
    # 2. 注意: 如果传递的元素类型不正确, 则会进行类型转换
    # TODO 警告信息如下:
    #   DeprecationWarning: an integer is required (got type float).
    #   Implicit conversion to integers using __int__ is deprecated,
    #   and may be removed in a future version of Python
    # 解决方式:①显示处理; ②用torch.tensor()来指定数据类型
    data = torch.IntTensor([2.5, 3.3])
    data2 = torch.IntTensor([int(2.5), int(3.3)])
    data3 = torch.tensor([2, 3], dtype=torch.int32)
    print(data)
    print(data2)
    print(data3)
    # 3. 其他的类型
    data = torch.ShortTensor()  # int16
    data = torch.LongTensor()  # int64
    data = torch.FloatTensor()  # float32
    data = torch.DoubleTensor()  # float64

image.png

2、创建线性和随机张量

  1. torch.arange 和 torch.linspace:创建线性张量
  2. torch.random.initial_seed 和 torch.random.manual_seed:随机种子设置
  3. torch.randn:创建随机张量
  1. 线性张量通常是指按顺序生成的张量,例如等差数列
  2. 随机张量是指元素值是随机数的张量
类型方法示例代码代码解释
线性张量torch.linspacelinear_tensor = torch.linspace(0, 10, steps=5)创建一个从0到10的包含5个元素的线性张量。
torch.arangelinear_tensor = torch.arange(0, 10, step=2)创建一个从0到10(不包括10),步长为2的线性张量。
随机张量torch.randrandom_tensor = torch.rand(2, 3)创建一个2x3的随机张量,元素均匀分布在[0, 1)区间。
torch.randnrandom_tensor = torch.randn(2, 3)创建一个2x3的随机张量,元素服从标准正态分布
torch.randintrandom_tensor = torch.randint(0, 10, (2, 3))创建一个2x3的随机整数张量,元素值在[0, 10)之间。
torch.randpermrandom_tensor = torch.randperm(10)创建一个从0到9的随机排列张量。

2.1、创建线性空间的张量

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/15 0:31
import torch


# 1. 创建线性空间的张量
def test01():
    # 1. 在指定区间按照步长生成元素 [start, end, step)
    data = torch.arange(0, 10, 2)
    print(data)
    # 2. 在指定区间按照元素个数生成
    data = torch.linspace(0, 11, 10)
    print(data)

image.png

2.2、创建随机张量

# 2. 创建随机张量
def test02():
    # 1. 创建随机张量
    data = torch.randn(2, 3)  # 创建2行3列张量
    print(data)

    # 2. 随机数种子设置
    print('随机数种子:', torch.random.initial_seed())
    torch.random.manual_seed(100)
    print('随机数种子:', torch.random.initial_seed())

image.png

2.3、什么是随机数种子

随机数种子(Random Seed)是用于初始化随机数生成器的一个整数值
随机数生成器是通过算法生成一系列看似随机的数字,但这些数字实际上是确定的,只要种子相同,每次生成的随机数序列也相同

随机数种子的作用:

  1. 确保可重复性:通过设置相同的随机数种子,可以确保每次运行程序时生成相同的随机数序列。这对于调试和实验非常重要,因为它允许研究人员和开发人员重现实验结果,从而验证和比较不同算法的性能。
  2. 调试和测试:在开发和调试过程中,设置随机数种子可以帮助定位和解决问题。固定种子后,如果程序出现问题,研究人员可以重现同样的条件进行调试。
  3. 实验的一致性:在机器学习和深度学习实验中,设置相同的随机数种子可以确保每次训练模型时的初始条件一致,从而使得实验结果具有可比性。
  4. 多次运行的一致性:在需要多次运行实验以取平均值或进行统计分析时,设置相同的种子可以确保每次运行的条件一致,从而减少实验结果的方差。

image.png
总结:

  1. 随机数种子是用于初始化随机数生成器的整数值。
  2. 作用:
    1. 确保程序的可重复性。
    2. 帮助调试和测试。
    3. 保证实验结果的一致性和可比性。
    4. 在多次运行实验时保持条件一致。

2.4、initial_seed()和manual_seed()

torch.random.initial_seed 和 torch.random.manual_seed 的区别:

  1. torch.random.initial_seed函数返回的是PyTorch启动时的随机种子(seed)。这个种子是在PyTorch加载时自动设置的,并且是全局的,通常在PyTorch启动时随机生成
  2. torch.random.manual_seed函数用于显式地设置随机种子,以确保结果的可重复性。通过设置相同的种子,可以确保每次运行时生成相同的随机数序列,这在调试和实验中非常有用。

3、创建01张量

  1. torch.ones 和 torch.ones_like 创建全1张量
  2. torch.zeros 和 torch.zeros_like 创建全0张量
  3. torch.full 和 torch.full_like 创建全为指定值张量

3.1、全0张量

def test01():
    # 1. 创建指定形状全0张量
    data = torch.zeros(2, 3)
    print(data)
    # 2. 根据张量形状创建全0张量
    data = torch.zeros_like(data)
    print(data)

image.png

3.2、全1张量

def test02():
    # 1. 创建指定形状全0张量
    data = torch.ones(2, 3)
    print(data)
    # 2. 根据张量形状创建全0张量
    data = torch.ones_like(data)
    print(data)

image.png

3.3、指定张量

def test03():
    # 1. 创建指定形状指定值的张量
    data = torch.full([2, 3], 10)
    print(data)
    # 2. 根据张量形状创建指定值的张量
    data = torch.full_like(data, 20)
    print(data)

image.png

4、张量元素类型转换⭐

  1. tensor.type(torch.DoubleTensor):将张量显式转换为指定的类型。
  2. torch.double():将张量转换为双精度浮点数
# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/15 2:13
import torch
def test():
    # 指定张量
    data = torch.full([2, 3], 10)
    print(data.dtype)
    # 将 data 元素类型转换为 float64 类型
    # 1. 第一种方法
    data = data.type(torch.DoubleTensor)
    print(data.dtype)
    # 转换为其他类型
    # data = data.type(torch.ShortTensor)
    # data = data.type(torch.IntTensor)
    # data = data.type(torch.LongTensor)
    # data = data.type(torch.FloatTensor)
    
    # 2. 第二种方法
    data = data.double()
    print(data.dtype)
    # 转换为其他类型
    # data = data.short()
    # data = data.int()
    # data = data.long()
    # data = data.float()

输出:
image.png

5、随机数生成器的算法⭐

随机数种子(Random Seed)是用于初始化随机数生成器的一个整数值。

下面介绍常见伪随机数生成算法

5.1、线性同余生成器LCG

线性同余生成器(Linear Congruential Generator, LCG)

这是最早的伪随机数生成器之一,生成的随机数序列由以下递归关系定义:
[ X n + 1 = ( a X n + c ) m o d    m ] [ X_{n+1} = (aX_n + c) \mod m ] [Xn+1=(aXn+c)modm]

参数含义

  • ( X ) ( X ) (X)是生成的伪随机数序列。
  • ( X n ) ( X_n ) (Xn) 表示当前的随机数。
  • ( X n + 1 ) ( X_{n+1} ) (Xn+1) 表示下一个随机数。
  • ( a ) ( a ) (a)是乘数(multiplier),通常选择为一个大整数。
  • ( c ) ( c ) (c)是增量(increment),也是一个整数。
  • ( m ) ( m ) (m)是模数(modulus),表示随机数的范围,通常是一个大整数。
  • ( X 0 ) ( X_0 ) (X0)是初始种子(seed),这是随机数生成的起点。

计算步骤

  1. 选择参数:确定乘数 ( a ) ( a ) (a)、增量 ( c ) ( c ) (c)、模数 ( m ) ( m ) (m)和初始种子 ( X 0 ) ( X_0 ) (X0)
  2. 计算下一个随机数:使用公式 ( X n + 1 = ( a X n + c ) m o d    m ) ( X_{n+1} = (aX_n + c) \mod m ) (Xn+1=(aXn+c)modm)计算下一个随机数。
  3. 循环生成:将 ( X n + 1 ) ( X_{n+1} ) (Xn+1)作为新的当前随机数,重复步骤2,生成所需数量的随机数。

优缺点

**优点:**简单且易于实现。
**缺点:**周期性强,产生的随机数质量较低。

5.2、梅森旋转算法

梅森旋转算法(Mersenne Twister)

梅森旋转算法是现代最常用的伪随机数生成算法之一,特别适合科学计算和仿真。

梅森旋转算法得名于它的周期长度,特别是 ( 2 19937 − 1 ) (2^{19937} - 1) (2199371),这是一个梅森素数。

其具体实现较为复杂,以下是简化的描述:

  1. 状态向量:算法维护一个状态向量,包含624个32位整数。
  2. 初始化
    1. 使用一个种子值初始化状态向量。
    2. 常用初始化方法为:
      [ state [ 0 ] = seed ] [ \text{state}[0] = \text{seed} ] [state[0]=seed]
      [ state [ i ] = ( f ⋅ ( state [ i − 1 ] ⊕ ( state [ i − 1 ] ≫ ( w − 2 ) ) ) ) + i ] [\text{state}[i] = (f \cdot (\text{state}[i-1] \oplus (\text{state}[i-1] \gg (w-2)))) + i] [state[i]=(f(state[i1](state[i1](w2))))+i]
  3. 生成随机数
    • 算法每次生成624个随机数,并存储在状态向量中。
    • 当所有624个数都被使用后,再次生成新的624个数。
  4. 旋转和混合
    • 生成新随机数的核心步骤是将状态向量旋转,并进行一系列混合操作以确保高质量的随机性。
    • 具体操作包括提取、变换和混合部分位数。

优点:长周期,良好的统计特性。
缺点:比较复杂,初始化时间较长。

两个公式解释:
[ state [ 0 ] = seed ] [ \text{state}[0] = \text{seed} ] [state[0]=seed]

state 是一个数组,用于存储梅森旋转算法的内部状态。
这个公式表示用给定的 seed(种子)值来初始化 state 数组的第一个元素。
seed 是算法的初始输入,它确定了随机数生成器的起点。

[ state [ i ] = ( f ⋅ ( state [ i − 1 ] ⊕ ( state [ i − 1 ] ≫ ( w − 2 ) ) ) ) + i ] [\text{state}[i] = (f \cdot (\text{state}[i-1] \oplus (\text{state}[i-1] \gg (w-2)))) + i] [state[i]=(f(state[i1](state[i1](w2))))+i]

这个公式用于初始化 state 数组的后续元素,i 从1到623(共624个元素)。
s t a t e [ i ] state[i] state[i]:数组 state 的第 i 个元素。
f f f:常数值 1812433253,用于混合操作。
s t a t e [ i − 1 ] state[i−1] state[i1]:数组 state 的第 i-1 个元素,即前一个元素。
⊕ ⊕ :按位异或操作。
≫ ≫ :算术右移操作。
w w w:字长,通常是32。
s t a t e [ i − 1 ] ≫ ( w − 2 ) state[i−1]≫(w−2) state[i1](w2):将 state[i-1] 向右移 w-2 位。
最后的 + i 是将当前的索引值 i 加到结果中。

5.3、Xorshift算法

Xorshift是一种基于异或操作的高效伪随机数生成器。

该算法使用一系列移位和异或操作生成随机数。

优点:快速,适合嵌入式系统。
缺点:周期相对较短,随机数质量依赖于具体实现。

5.4、其他算法

其他常见的伪随机数生成算法还包括:

  • Lehmer随机数生成器:也是一种线性同余生成器,但参数选择得更好。
  • PCG(Permuted Congruential Generator):新的伪随机数生成器,具有良好的统计特性和性能。

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

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

相关文章

PGCCC|【PostgreSQL】PCP认证考试大纲#postgresql 认证

PostgreSQL Certified Professional PCP(中级) PCP目前在市场上非常紧缺,除了具备夯实的理论基础以外,要有很强的动手能力,获得“PCP(中心)“的学员,将能够进入企业的生产系统进行运…

MongoDB自学笔记(二)

一、前言 接着上一篇文章,在上一篇文章中学习了如何使用数据库、如何创建集合、如何往集合里添加文档,今天我们继续学习一下更新文档,更新文档相对来说比较复杂笔者打算分多次来记录学习过程。 二、文档操作 1、更新文档 基础语法&#x…

爬虫-requests和Selenium

1、了解requests的功能 1.1 使用post和get发送请求 HTTP中常见发送网络请求的方式有两种,GET和POST。GET是从指定的资源请求数据,POST是向指定的资源提交要被处理的数据。 GET的用法: import requestsr requests.get("https://www.…

面试题010-数据库-MySQL(MySQL+索引)

面试题010-数据库-MySQL(MySQL索引) 目录 面试题010-数据库-MySQL(MySQL索引)题目自测题目答案1. MySQL是什么?有什么优点?2. 什么是SQL注入?如何解决SQL注入?3. MyISAM 和 InnoDB 有什么区别?4. SQL在MySQL数据库中的…

【论文阅读】LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING?

LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING? https://openreview.net/forum?idwxClzZdjqP 图对比学习的重点就是图数据的增强,针对图中节点的表示或者图的结构进行扰动,通过对比学习得到对应的节点表示,以便于…

azure学习在日本IT工作的重要性

在日本数字化转型的浪潮中,微软Azure已经成为众多企业的首选云平台。作为全球第二大云服务提供商,Azure在日本市场的重要性与日俱增。本文将探讨为什么学习Azure对日本IT专业人士至关重要,以及如何通过lalapodo云原生技术的培训课程,快速掌握这一关键技能。 Azure在日本的战略地…

MongoDB教程(五):mongoDB聚合框架

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言MongoDB 聚…

如何申请抖音本地生活服务商?3种方式优劣势分析!

随着多家互联网大厂在本地生活板块的布局力度不断加大,以抖音为代表的头部互联网平台的本地生活服务商成为了创业赛道中的大热门,与抖音本地生活服务商怎么申请等相关的帖子,更是多次登顶创业者社群的话题榜单。 就目前的市场情况来看&#x…

Gitlab CI/CD --- use a sample CI/CD template

0 Preface/Foreword Pipeline, job, stage的关系如下描述: A pipeline is composed of independent jobs that run scripts, grouped into stages. Stages run in sequential order, but jobs within stages run in parallel. 关键信息: pipeline由独…

新款S32K3 MCU可解决汽车软件开发的成本和复杂性问题(器件编号包含S32K322E、S32K322N、S32K328)

全新的S32K3系列专门用于车身电子系统、电池管理和新兴的域控制器,利用涵盖网络安全、功能安全和底层驱动程序的增强型封装持续简化软件开发。 相关产品:S32K328NHT1VPCSR S32K328GHT1MPCSR S32K322NHT0VPASR S32K322EHT0VPBSR S32K322NHT0VPBSR S32K32…

javascript之匿名函数和立即执行函数

函数总体分为具名函数(有名字)和匿名函数 匿名函数使用方法: let fn function (x, y) { // console.log(函数) console.log(x y) } fn(1, 2) 正常函数: function fun() { console.log(1) } fun() 2.立即执行函数 好处是避免全局…

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

作者:俊达 proxysql作为一个程序,本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。 可以在多个节点上部署proxysql,在proxysql之前再加一层负载均衡(如使用LVS或其他技术&#x…

dab-detr: dynamic anchor boxes are better queries for detr【目标检测-方法详细解读】

DAB-DETR: Dynamic Anchor Boxes Are Better Queries for DETR 摘要 在本文中,我们提出了一种新的查询形式,使用动态锚框作为DETR(DEtection TRansformer)的查询,并提供了对DETR中查询角色的更深入理解。这种新形式直…

《昇思25天学习打卡营第21天|基于 MindSpore 实现 BERT 对话情绪识别》

#学习打卡第21天# 1. BERT 模型 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型,是基于Transformer中的Encoder并加上双向…

Vue中使用mind-map实现在线思维导图

概述 在前面的文章Vue中实现在线画流程图实现中介绍了流程图的在线绘制,在本文,给大家分享一下基于mind-map实现在线的思维导图,并实现:1. 导图导出为图片;2. 打开xmind文件。 实现效果 实现 1. mind-map简介 simp…

文心一言《使用手册》,文心一言怎么用?

一、认识文心一言 (一)什么是文心一言 文心一言是百度研发的 人工智能大语言模型产品,能够通过上一句话,预测生成下一段话。 任何人都可以通过输入【指令】和文心一言进行对话互动、提出问题或要求,让文心一言高效地…

线程安全(六)AQS 的工作原理

目录 一、AQS 概述1.1 什么是 AQS?1.2 AQS 与 synchronized 区别:1.3 AQS 常见的实现类:二、AQS 的工作原理2.1 state 的用途:2.2 AQS 双向链表:2.3 ConditionObject 双向队列:2.4 总结:画图说明三、AQS 资源同步3.1 AQS 资源同步方式3.2 自定义同步器3.3 常见同步工具类…

简单记录一下在java的Mybatis-plus中用一个SQL语句查询一个嵌套的实体类(实体类中有List,List中还有List)

简单记录一下在java的Mybatis-plus中用一个SQL语句查询一个嵌套的实体类(实体类中有List,List中还有List) 也就是KpCourseInfoClientDetailVO课程详情类中含有List courseChapterList章节列表,然后章节列表中含有List lessonList课时列表,通过一个SQL查询得到结果 KpCourseIn…

对服务器进行基本了解(二)

目录 一. 云服务器数据库 1.查看MYSQL版本 2.查看mysql的运行状态 3.运行mysql 4. 进入mysql的用户 5. 更改用户密码 6. 查找mysql端口号 7. 创建一个数据库 8. 查看用户 9. 查看数据库 10. 显示数据库的表 11. 修改用户的host 12. 对用户赋权 13. 开放指定端…

2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛--学习笔记

#Datawhale #NLP 1.背景介绍: 机器翻译(Machine Translation,简称MT)是自然语言处理领域的一个重要分支,其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代,经历…