【PyTorch与深度学习】3、PyTorch张量的运算API(下)

课程地址
最近做实验发现自己还是基础框架上掌握得不好,于是开始重学一遍PyTorch框架,这个是课程笔记,这个课还是讲的简略,我半小时的课听了一个半小时。

1. PyTorch的数据类型

数据类型dtype参数遗留的构造函数
32位浮点数torch.float32 或 torch.floattorch.*.FloatTensor
64位浮点数torch.float64 或 torch.doubletorch.*.DoubleTensor
64位复数torch.complex64 或 torch.cfloat
182位复数torch.complex128 或 torch.cdouble
第一类16位浮点数torch.float16 或 torch.half (指数位是用5个比特表示的)torch.*.HalfTensor
第二类16位浮点数torch.bfloat16( 指数位是用8个比特表示的)torch.*.BFloat16Tensor
8位无符号整数torch.uint8torch.*.ByteTensor
8位有符号整数torch.int8torch.*.CharTensor
16位有符号整数torch.int16 或 torch.shorttorch.*.ShortTensor
32位有符号整数torch.int32 或 torch.inttorch.*.IntTensor
64位有符号整数torch.int64 或 torch.longtorch.*.LongTensor
布尔类型torch.booltorch.*.BoolTensor

浮点数计算方式详见IEEE 754二进制浮点数算术标准百度百科,实际炼丹的时候注意一下就行,不用细究,主要是精度不同。

2. 张量操作

(1)take:返回一个新张量,其元素为给定索引处的输入。输入张量被视为1-D张量。结果与索引具有相同的形状。

import torchsrc = torch.tensor([[4, 3, 5],[6, 7, 8]])
a = torch.take(src, torch.tensor([0, 2, 5]))  # 无论src是几维张量,都将其按行优先变成1维张量
#take[4, 3, 5, 6, 7, 8]从中找到下标位0, 2, 5的元素
print(a)

运行结果:
tensor([4, 5, 8])
(2)tile:通过重复输入的元素来构造张量。dims是指定在哪一个维度进行重复。如果 dims 指定的维度少于输入的维度,则将 ones 添加到 dims 之前,直到指定了所有维度。例如,如果输入的形状为 (8, 6, 4, 2),而 dims 为 (2, 2),则将 dims 视为 (1, 1, 2, 2)。

import torchx = torch.tensor([1, 2, 3])
print(x.tile((2,)))  # 相当于对[1, 2, 3]复制两份
y = torch.tensor([[1, 2], [3, 4]])
# 对第一个维度行复制两份,对第二个维度列复制两份
print(torch.tile(y, (2, 2)))
# 先复制行[[1,2], [3,4], [1,2], [3,4]]
# 再复制列[[1,2,1,2], [3,4,3,4], [1,2,1,2], [3,4,3,4]]
print(torch.tile(y, (3, 2)))  # 第一个维度复制3份,第二个维度复制两份
# 先复制行[[1,2], [3,4], [1,2], [3,4], [1,2], [3,4]]
# 再复制列[[1,2,1,2], [3,4,3,4], [1,2,1,2], [3,4,3,4], [1,2,1,2], [3,4,3,4]]

运行结果:
tensor([1, 2, 3, 1, 2, 3])
tensor([[1, 2, 1, 2],
[3, 4, 3, 4],
[1, 2, 1, 2],
[3, 4, 3, 4]])
tensor([[1, 2, 1, 2],
[3, 4, 3, 4],
[1, 2, 1, 2],
[3, 4, 3, 4],
[1, 2, 1, 2],
[3, 4, 3, 4]])

(3)transpose:对张量进行转置(二维张量,也就是矩阵,它的转置就类似矩阵转置),如果是多维度,可以通过dim0和dim1确定交换维度。

import torchx = torch.randn(2, 3)
print(x)
x = torch.transpose(x, 0, 1)  # 交换维度0和维度1,相当于取转置,写1, 0也是一样的,都是交换(转置)
print(x)

运行结果:
tensor([[-1.9731, -0.1187, 1.4879],
[ 0.7525, -1.9673, -0.9391]])
tensor([[-1.9731, 0.7525],
[-0.1187, -1.9673],
[ 1.4879, -0.9391]])

(4)unbind:移除一个张量的维度,默认移除0维度。

import torch# 默认按维度0(行)消除张量的维度,即拆分
print(torch.unbind(torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])))
# 按维度1(列)消除张量的维度,即拆分
print(torch.unbind(torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]]), dim = 1))

运行结果:
(tensor([1, 2, 3]), tensor([4, 5, 6]), tensor([7, 8, 9]))
(tensor([1, 4, 7]), tensor([2, 5, 8]), tensor([3, 6, 9]))
(5)unsqueeze:在某些特定的维度上新增一个维度。

import torch# 在x维度上新增一维度,x的范围是(-x.dim-1,x.dim+1)
x = torch.tensor([1, 2, 3, 4])
a = torch.unsqueeze(x, 0)  # 在第0维度新增一个维度(新增后的第0维(行),是行上新增一个维度)
print(a)
b = torch.unsqueeze(x, 1)  # 在第1维度新增一个维度(新增后的第1维(列),是列上新增一个维度)
print(b)
c = torch.unsqueeze(x, -1)  # 在第最后一个维度新增一个维度(新增后的最后一个维度就是第1维(列),是列上新增一个维度)
print(c)

运行结果:
tensor([[1, 2, 3, 4]])
tensor([[1],
[2],
[3],
[4]])
tensor([[1],
[2],
[3],
[4]])

(6)vsplit:根据indices _or_sections,将输入(一个具有二维或多维的张量)垂直拆分为多个张量。每个分割都是一个输入视图。

import torcht = torch.arange(16.0).reshape(4,4)
print(t)
a = torch.vsplit(t, 2)  # 按垂直方向(行)分两份
print(a)
b = torch.vsplit(t, [3, 6])  # 按垂直方向(行)分3:6粉
print(b)

运行结果:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])
(tensor([[0., 1., 2., 3.],
[4., 5., 6., 7.]]), tensor([[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]))
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]), tensor([[12., 13., 14., 15.]]), tensor([], size=(0, 4)))

(7)vstack:垂直(逐行)按顺序堆叠张量。

import torcha = torch.tensor([1, 2, 3])  # 行向量
b = torch.tensor([4, 5, 6])  # 行向量
print(torch.vstack((a,b)))  # 按垂直(行)方向,拼接行向量
a = torch.tensor([[1],[2],[3]])  # 列向量
b = torch.tensor([[4],[5],[6]])  # 列向量
print(torch.vstack((a,b)))  # 按垂直(行)方向,拼接列向量

运行结果:
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[1],
[2],
[3],
[4],
[5],
[6]])

(8)where:根据条件,返回从输入或其他输入中选择的元素的张量。(类似if else条件)

import torchx = torch.randn(3, 2)  # 随机值3x2张量
y = torch.ones(3, 2)  # 全1的3X2张量
print(x)
print(torch.where(x > 0, 1.0, 0.0))  # x某个位置元素大于0就将这个位置的元素赋值为1,否则就将这个位置的元素赋值为0
print(torch.where(x > 0, x, y))  # x某个位置元素大于0就保留,否则就将这个位置的元素赋值为y对应位置的元素
x = torch.randn(2, 2, dtype=torch.double)
print(x)
print(torch.where(x > 0, x, 0.))  # x某个位置元素大于0就将这个位置的元素赋值为x原本对应位置的元素,否则就将这个位置的元素赋值为0

运行结果:
tensor([[ 1.2857, 0.6624],
[-1.2176, -0.2741],
[-0.7331, -0.6283]])
tensor([[1., 1.],
[0., 0.],
[0., 0.]])
tensor([[1.2857, 0.6624],
[1.0000, 1.0000],
[1.0000, 1.0000]])
tensor([[ 0.0079, -0.1124],
[ 0.6240, -0.1965]], dtype=torch.float64)
tensor([[0.0079, 0.0000],
[0.6240, 0.0000]], dtype=torch.float64)

(9)manual_seed:设置用于生成随机数的种子。固定随机种子,方便对论文的复现。参数随机初始化,初始值不一样结果不同,如果随机种子固定就不会变化。
(10)bernoulli:伯努利采样,基于伯努利概率模型生成采样值,返回的是0或者1.

import torcha = torch.empty(3, 3).uniform_(0, 1)  # 生成服从正态分布的3x3矩阵
print(a)
print(torch.bernoulli(a))a = torch.ones(3, 3) # 3X3全为1的张量(概率为1)
print(torch.bernoulli(a))
a = torch.zeros(3, 3) # 3X3全为0的张量(概率为0)
print(torch.bernoulli(a))

运行结果:
tensor([[0.5975, 0.4570, 0.8206],
[0.4460, 0.0134, 0.4570],
[0.2273, 0.1717, 0.5898]])
tensor([[1., 0., 1.],
[0., 0., 1.],
[0., 0., 1.]])
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])

【GPT回答】伯努利分布是概率论和统计学中的一种离散型概率分布,用来描述只有两种可能结果的随机试验,比如成功或失败、正面或反面、1或0等。它以其名字命名于瑞士数学家雅各布·伯努利。在伯努利分布中,随机变量取值为1表示成功的概率,取值为0表示失败的概率。这个分布的参数是成功的概率 p p p,通常表示为 Bern ( p ) \text{Bern}(p) Bern(p)。伯努利分布的概率质量函数可以用以下公式表示:
P ( X = x ) = p x ⋅ ( 1 − p ) 1 − x P(X=x) = p^x \cdot (1-p)^{1-x} P(X=x)=px(1p)1x
其中, x x x 可以取 0 或 1,分别对应失败和成功, p p p 是成功的概率。
伯努利分布的期望值 E ( X ) E(X) E(X) 可以用 p p p 表示,方差 Var ( X ) ) 则为 ( p ( 1 − p ) \text{Var}(X) ) 则为 ( p(1-p) Var(X))则为(p(1p)。这个分布在许多领域中都有广泛的应用,比如在金融领域的二项期权定价、医学试验的结果分析、工程项目的成功率分析等。

(11)normal:生成正态分布的采样,传入的参数是均值和方差。可以单独传均值和标准差,也可以共享均值,标准差传入的是一个张量。也可以共享标准差,均值不同。

import torchprint(torch.normal(mean=torch.arange(1., 11.), std=torch.arange(1, 0, -0.1)))  # 均值是1到11,方差是1到0,步长是-0.1# 共享均值0.5,标准差不一样
print(torch.normal(mean=0.5, std=torch.arange(1., 6.)))# 均值不一样,共享标准差
print(torch.normal(mean=torch.arange(1., 6.)))# 从均值为2,标准差为3的正态分布中取样出2X4的张量
print(torch.normal(2, 3, size=(2, 4)))

运行结果:
tensor([0.6761, 2.1100, 2.9759, 4.0812, 4.8908, 5.5873, 7.5505, 7.2527, 8.9929,
9.9476])
tensor([ 1.5508, 0.2023, 0.2276, -0.1333, 2.6893])
tensor([1.2311, 1.9547, 2.9189, 4.6270, 4.2430])
tensor([[-1.5097, -3.3287, 2.7755, 0.3581],
[ 5.4610, 2.5765, 2.7561, 3.8923]])
(12)rand:从0到1的区间(左闭右开)生成均匀分布。

import torchprint(torch.rand(4))  # 一维长度为4的[0,1)的均匀分布
print(torch.rand(2, 3))  # 二维2X3的[0,1)的均匀分布

运行结果:
tensor([0.0835, 0.1057, 0.9253, 0.3540])
tensor([[0.9528, 0.7700, 0.2160],
[0.8131, 0.7256, 0.2035]])

(13)randint:从指定区间随机取整数。左闭右开。

import torchprint(torch.randint(3, 5, (3,)))  # 在[3, 5)的整数中随机取三个值

运行结果:
tensor([4, 3, 4])
(14)randn:从均值为0标准差为1的正态分布中采样随机浮点数。

import torchprint(torch.randn(4))  # 生成长度为1的1维的均值为0标准差为1的正态分布的随机采样浮点数值
print(torch.randn(2, 3))  # 生成2X3的2维的均值为0标准差为1的正态分布的随机采样浮点数值

运行结果:
tensor([ 0.0714, -2.0626, -1.5583, 1.6608])
tensor([[ 1.0924, -1.8781, -0.1767],
[-0.7686, 1.1433, 1.4133]])

(15)randperm:将[0, x)中的整数进行随机组合。构建数据集,随机化数据集经常用。

import torchprint(torch.randperm(4))  # 生成[0,4)的整数的随机组合

运行结果:
tensor([1, 2, 3, 0])

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

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

相关文章

WPS二次开发系列:如何使用WPS返回的FileUri

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 什么是FileUri 在SDK中的使用场景 打开文档时…

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台,旨在处理大规模数据的存储和处理。它提供了分布式文件系统(HDFS)和分布式计算框架(MapReduce),使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

15、Python:循环控制语句

在编程中,循环控制语句是实现代码重复执行的基本结构。Python 提供了多种循环控制结构,以适应不同的编程场景。本文将详细介绍 Python 中的 for 循环和 while 循环,以及如何使用 break 和 continue 语句来控制循环流程。 for 循环 for 循环…

spring boot test 设置环境变量

在 Spring Boot 中,可以通过在测试类上添加 TestPropertySource 注解来设置测试环境变量。该注解可以指定一个或多个 properties 文件,或者一个或多个 key-value 形式的环境变量。 例如,如果您有一个名为 application-test.properties 的测试…

cmake进阶:定义函数的使用方法

一. 简介 前面已经将 cmake 中常用的命令 command、变量 variable 都给大家进行了详细介绍,通过前面的学习,相信大家已经掌握了 cmake 工具的基本使用方法; 接下来我们再进一步学习 cmake,本文开始学习 cmake中定义函数。 二. …

TypeScript学习日志-第十九天(namespace命名空间)

namespace命名空间 一、基本用法 namespace 所有的变量以及方法必须要导出才能访问,如图: 二、 嵌套 namespace 可以进行嵌套使用,如图: 它也必须需要导出才能访问 三、合并 当我们出现两个同名的 namespace 它就会合并这两…

EFDC模型安装及建模方法;在排污口论证、水质模拟、地表水环评、地表水水源地划分、水环境容量计算等领域中的应用

目录 专题一 EFDC软件安装 专题二 EFDC模型讲解 专题三 一维河流模拟实操 专题四 建模前处理 专题五 EFDC网格剖分介绍 专题六 EFDC二维湖库水动力模拟/非保守染色剂模拟 专题七 EFDC水质模型参数及原理介绍 专题八 EFDC一、二、三维湖库水质模拟 专题九 基于EFDC的地…

nodejs的ws+vue3编写聊天室的demo

nodejs编写ws服务是非常简单高效的,nodejs有众多的实现ws的库,如ws,SocketIO等,nodejs的事件线程是单线程的,所以不要在事件线程内做阻塞性的操作,耗时的操作交给工作线程或者子进程操作。 我使用nodejsvue3实现了写了…

408数据结构-二叉树的遍历 自学知识点整理

前置知识:二叉树的概念、性质与存储结构 二叉树的遍历 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 二叉树的递归特性: ①要么是棵空二叉树; ②要么就是由“根节点左子树右子树…

【NOI】C++程序结构入门之分支结构二

文章目录 前言一、逻辑运算符1.导入2.逻辑与(&&)3.逻辑或(||)4.逻辑非(!) 二、例题讲解问题:1656. 是两位的偶数吗问题:1658. 游乐设施问题:1659. 是否含有数字5…

Linux下的Git指令操作

1.安装git sudo apt-get install git 2.本地拉取已有仓库项目(红色部分请替换) git clone https://github.com/test/test.git 3. 上传本地新增内容(文本或文件夹) git add XXX 4.添加新增内容说明 git commit -m XXXX 5. 将本地仓库同步修改到远程仓库 …

AI绘画:Stable Diffusion 拒绝一眼塑料味的AI质感,超写实人物图片如何制作?简单几步教会你!

今天给大家介绍一款能够对生成的人像进行皮肤调节的 lora。 上面两幅图片的生成参数一样,尺寸也一样,但右边一幅图片相较于左面图片的画面质感,特别是人像皮肤的质感上有很大的提升,看上去更加细腻有层感。 这就是我们今天要介绍…

条款5:对定制的“类型转换函数”保持警觉

C允许编译器在不同类型之间执行隐式转换(implicit conversions)。 继承了C的伟大传统,这个语言允许默默地将char转换为 int,将 short 转换为 doublea这便是为什么你可以将一个short 交给一个“期望获得double”的函数而仍能成功的…

linux下的调试工具gdb的详细使用介绍

在之前学习中我们使用的通常是集各种功能于一体的编译器,例如VS stdio,但是一个程序在编辑后还要进行编译,然后才能产生一个二进制的可执行文件,编辑和翻译工作都可以使用不同的软件进行,例如记事本就是一款编辑软件&a…

03.配置监控一台服务器主机

配置监控一台服务器主机 安装zabbix-agent rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm配置zabbix-agent,配置的IP地址是zabbix-server的地址,因为要监控这台主机 vim /etc/zabbix/zab…

android开发环境搭建步骤

搭建Android开发环境需要完成以下几个步骤: 下载Android Studio:访问Android官方网站下载最新版本的Android Studio安装包。安装Android Studio:运行下载的安装程序,按照提示完成安装过程。如果C盘空间足够,推荐安装在…

智能指针三剑客:shared_ptr的使用

目录 shared_ptr错误范例 其他补充 尺寸问题 移动语义 shared_ptr错误范例 裸指针&#xff1a; #include<iostream> using namespace std; void Test(shared_ptr<int> ps) {return; } int main() {int *pnew int(666);Test(p); //E0415 不存在从 "int *&…

免费开源线上线下交友社交圈子系统 小程序+APP+H5 可支持二开!

为什么要玩社交软件&#xff1a;互联网社交软件的独特优势 首先&#xff0c;社交软件为我们提供了一个便捷的沟通方式。在传统的交往方式中&#xff0c;人们需要面对面交流&#xff0c;这种方式在时间和空间上都受到限制。而社交软件打破了这些限制&#xff0c;无论我们身处何地…

既能自动仿写公众号爆文,还能批量帮你上架闲鱼商品,打造自己的数字员工,简直yyds

「想象一下&#xff0c;如果有一个机器人在你的计算机上24小时不间断地工作&#xff0c;会不会做梦都笑着」 一、RPA机器人是什么&#xff1f; RPA——机器人流程自动化&#xff0c;它可以帮助人们完成重复性的、繁琐的工作&#xff0c;比如数据输入、网页爬取、自动化流程等…

llama3 史上最强开源大模型,赶超GTP-4,逼宫OpenAI

2024年4月18日&#xff0c;Meta公司推出了开源大语言模型Llama系列的最新产品—Llama 3&#xff0c;包含了80亿参数的Llama 3 8B和700亿参数的Llama 3 70B两个版本。Meta称其为“迄今为止最强的开源大模型”。 怪兽级性能 LLaMA3 提供了不同参数规模的版本&#xff0c;以适应…