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

文章目录

  • 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. 列表, 下面代码使用默认元素类型 float32data = [[10., 20., 30.], [40., 50., 60.]]data = torch.tensor(data)print(data)

image.png

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

# 2. 创建指定形状的张量
def test02():# 1. 创建2行3列的张量, 默认 dtype 为 float32data = 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()  # int16data = torch.LongTensor()  # int64data = torch.FloatTensor()  # float32data = 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.mzph.cn/bicheng/46692.shtml

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

相关文章

Springboot+Aop用注解实现阿里云短信验证码校验,校验通过自动删除验证码缓存

1.新建操作类型枚举&#xff08;这里的IEnum是我自定义的http请求拦截接口&#xff0c;不需要的话可以不用实现&#xff09; Getter AllArgsConstructor public enum OperationType implements IEnum<Integer> {/*** 注册*/SIGN_UP(0),/*** 密码登录*/LOGIN_BY_PWD(1),/…

Apache Lucene 详解及示例

Apache Lucene 详解及示例 1. 简介 Apache Lucene 是一个高性能的全文搜索引擎库&#xff0c;广泛应用于构建搜索系统。本文将详细解析 Lucene 的核心概念和主要功能&#xff0c;并通过多个示例代码演示其使用方法。 2. 核心概念 2.1 倒排索引 倒排索引将文档中的每个词条…

【Java18】初始化块

初始化块和构造器、成员变量、成员方法一起&#xff0c;是唯四能在类中出现的成员。 初始化块的作用和构造器类似&#xff0c;目的是对对象进行初始化操作&#xff1b;一个类中可以有多个初始化块&#xff1b;初始化块只有两种修饰方式&#xff1a;static和default。用static修…

向量数据量milvus k8s helm 对接外部安装部署流程

前情概要&#xff1a;历经了太多的坑&#xff0c;从简单的到困难的&#xff0c;该文章主要是为大家尽可能的展现安装部署流程中遇见的坑&#xff01; 如果2024年7月15日17:13:41 你处在这个时间阶段 附近&#xff0c;你会发现docker下载镜像失败&#xff01; 这个问题&#xff…

[C/C++入门][ifelse]11、三位数找最大值(比大小以及多个数找最大值)

比较数的大小 在学习数学的早期阶段&#xff0c;孩子们会学会如何比较两个数的大小。他们通常通过观察数的数字组成来判断哪个数更大。例如&#xff0c;当比较数字34和56时&#xff0c;如果左边第一位的数字不同&#xff0c;那么具有较大数字的数就是较大的数。在这个例子中&a…

nginx生成自签名SSL证书配置HTTPS

一、安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块&#xff1a; rootecs-7398:/usr/local/nginx# cd /usr/local/nginx/ rootecs-7398:/usr/local/nginx# ./sbin/nginx -V nginx version: nginx/1.20.2 built by gcc 9.4.0 (Ubuntu 9.4.0…

机器学习与神经网络之间的关系 --九五小庞

机器学习与神经网络之间存在紧密而复杂的关系。简而言之&#xff0c;神经网络是机器学习领域中的一个重要分支&#xff0c;尤其是深度学习的核心组成部分。下面详细解释它们之间的关系&#xff1a; 机器学习概述 机器学习是一门涉及让计算机系统从数据中自动学习和改进的学科。…

k8s secret-从环境变量里去读和从yaml文件里读取secret有什么区别?

从环境变量和YAML文件中读取Kubernetes Secret的区别主要体现在使用方式、动态更新能力以及管理便捷性上。以下是详细的区别说明&#xff1a; 1. **使用方式**&#xff1a; - **环境变量方式**&#xff1a;Kubernetes允许将Secret作为环境变量注入到Pod的容器中。这种方式的好处…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写&#xff0c;它是Android SDK 中的一个调试工具&#xff0c;允许开发者通过命令行界面与设备进行交互&#xff0c;执行各种操作&#xff0c;如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

微服务经纬:Eureka驱动的分布式服务网格配置全解

微服务经纬&#xff1a;Eureka驱动的分布式服务网格配置全解 在微服务架构的宏伟蓝图中&#xff0c;服务网格&#xff08;Service Mesh&#xff09;作为微服务间通信的独立层&#xff0c;承担着流量管理、服务发现、故障恢复等关键任务。Eureka&#xff0c;Netflix开源的服务发…

我的GeneFace++部署与运行之旅

文章目录 引言项目背景概述重要性分析结论 环境准备1. 安装CUDA2. 安装Python依赖3. 准备3DMM模型&#xff08;BFM2009&#xff09;及其他数据 运行官方 Demo训练自己的视频数据准备训练推理测试 遇到的问题与解决方案问题一&#xff1a;cuda 安装完发现版本不对问题二&#xf…

C语言 底层逻辑详细阐述结构体 #结构体的声明 #结构体的初始化 #结构体成员访问 #结构体传参

文章目录 前言 一、结构体的基础知识 二、结构体的初始化 1、结构体类型声明&#xff1a; 2、结构体成员的类型 3、结构体变量的初始化&#xff1a; 三、结构体成员访问 四、结构体传参 总结 前言 基于自我理解的角度来讲结构体&#xff1b; 一、结构体的基础知识 结构是一些…

网络安全-网络设备及其配置1

1.路由器 路由器的作用 路由器是连接多个网络的设备&#xff0c;主要功能是数据包的转发和路由选择。路由器通过分析目标IP地址&#xff0c;将数据包从一个网络转发到另一个网络&#xff0c;确保不同网络之间的通信。它在家庭、企业和互联网服务提供商&#xff08;ISP&#x…

vue3入门特性

Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架&#xff1a;核心思想是通过声明式的方式来描述 UI 组件&#xff0c;并通过响应式系统来自动更新 UI。Vue 3 引入了许多新特性和改进&#xff0c;包括组合式 API&#xff08;Composition API&#xff09;、更好的性能和 T…

NSSCTF中24网安培训day2中web题目

[SWPUCTF 2021 新生赛]ez_unserialize 这道题目考察php反序列化的知识点 打开题目&#xff0c;发现没有提示&#xff0c;我们试着用御剑扫描目录文件&#xff0c;发现存在robots.txt的文件 接着访问这个文件&#xff0c;发现是一段php反序列化代码&#xff0c;我们需要进行序…

论文翻译:通过云计算对联网多智能体系统进行预测控制

通过云计算对联网多智能体系统进行预测控制 文章目录 通过云计算对联网多智能体系统进行预测控制摘要前言通过云计算实现联网的多智能体控制系统网络化多智能体系统的云预测控制器设计云预测控制系统的稳定性和一致性分析例子结论 摘要 本文研究了基于云计算的网络化多智能体预…

【常见开源库的二次开发】基于openssl的加密与解密——Base58比特币钱包地址——算法分析(三)

目录&#xff1a; 目录&#xff1a; 一、base58(58进制) 1.1 什么是base58&#xff1f; 1.2 辗转相除法 1.3 base58输出字节数&#xff1a; 二、源码分析&#xff1a; 2.1源代码&#xff1a; 2.2 算法思路介绍&#xff1a; 2.2.1 Base58编码过程&#xff1a; 2.1.2 Base58解码过…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题&#xff08;143&#xff09; Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…

实战案例:用百度千帆大模型API开发智能五子棋

前随着人工智能技术的迅猛发展&#xff0c;各种智能应用层出不穷。五子棋作为一款经典的棋类游戏&#xff0c;拥有广泛的爱好者。将人工智能技术与五子棋结合&#xff0c;不仅能提升游戏的趣味性和挑战性&#xff0c;还能展现AI在复杂决策问题上的强大能力。在本篇文章中&#…

Elasticsearch:将Logstash日志存到elasticsearch中

配置Logstash # cat syslog02.conf #filename:syslog02.conf #注意这个是要用#号注释掉 input{file{path > ["/var/log/*.log"]} } output{elasticsearch {#建议将搜索引擎不要和应用部署到一台服务器&#xff0c;我们介绍就同台服务器hosts > ["192.168…