AI学习(3): PyTorch-初识张量

1.介绍

PyTorch中的张量(tensor)是其核心数据结构,表示任意维度的数组。张量可以用于存储和处理数据,是PyTorch中的基本构建模块。

PyTorch中,张量是torch.Tensor类的实例,它提供了丰富的方法和功能,用于进行数值计算和深度学习模型的构建与训练。

1.1 创建函数

PyTorch中,有多种方法可以创建张量,如:torch.tensor()、torch.as_tensor()、torch.from_numpy()等。这些方法在处理不同类型的数据和内存共享方面有所不同,开发者可以根据具体需求选择合适的方法来创建张量;

torch.tensor()PyTorch 中常用于创建张量的函数之一。该函数可以从其他 Python 可迭代对象(如列表、元组)或 NumPy 数组中创建张量。下面是 torch.tensor() 函数的主要参数和它们的含义:

torch.tensor(data, dtype=None, device=None, requires_grad=False)

参数说明:

  • data (必填): 要转换为张量的数据。可以是 Python 列表( list)、元组( tuple)、 NumPy 数组等可迭代对象。
  • dtype (可选): 指定张量的数据类型。如果不提供, PyTorch 将尝试推断数据类型。
  • device (可选): 指定张量存储的设备,可以是 CPUGPU。如果不提供,将使用默认设备。
  • requires_grad (可选): 是否启用自动求导机制,以便追踪对张量的操作并计算梯度,默认 False

@注意:使用as_tensor()创建张量,将共享底层数据,对张量的修改会影响原始数据。

1.2 重要属性

张量(tensor)有很多重要的属性。以下是一些常用的 torch.Tensor 属性:

import numpy as np
import torch

if __name__ == "__main__":
    # 张量创建
    # 从numpy中创建张量
    numpyArray = np.array([
        [123],
        [456]
    ])
    numpyTensor = torch.tensor(numpyArray)
    print("numpyTensor: ", numpyTensor)
    print("形状: ", numpyTensor.shape)
    print("数据类型: ", numpyTensor.dtype)
    print("放置设备(GPU|CPU): ", numpyTensor.device)
    print("自动求导属性: ", numpyTensor.requires_grad)
    print("梯度信息: ", numpyTensor.grad)
    print("梯度函数: ", numpyTensor.grad_fn)

    
"""
numpyTensor:  tensor([[1, 2, 3],
        [4, 5, 6]])
形状:  torch.Size([2, 3])
数据类型:  torch.int64
放置设备(GPU|CPU):  cpu
自动求导属性:  False
梯度信息:  None
梯度函数:  None
"""

1.3 数据类型

在使用torch.tensor()函数创建张量时,可以使用参数dtype指定张量的元素类型,如:

# 指定张量类型为:torch.float32
torch.tensor([123], dtype=torch.float32)

以下是 torch.Tensor 支持的常见数据类型列表:

数据类型描述
torch.int88位有符号整数
torch.int1616位有符号整数
torch.int3232位有符号整数
torch.int6464位有符号整数
torch.uint88位无符号整数
torch.float1616位浮点数
torch.float3232位浮点数
torch.float6464位浮点数
torch.complex6464位复数(32位实部和虚部)
torch.complex128128位复数(64位实部和虚部)
torch.bool布尔类型(True 或 False)

2.张量创建

2.1 基于列表创建

import numpy as np
import torch

# 从list中创建张量
listTensor = torch.tensor([123])

2.2 基于numpy创建

import numpy as np
import torch
if __name__ == "__main__":
    # 从numpy中创建张量
    numpyArray = np.array([
        [123],
        [456]
    ])
    # 使用函数:from_numpy
    numpyTensorA = torch.from_numpy(numpyArray)
    print("numpyTensorA: ", numpyTensorA)
    # 使用函数: torch.tensor
    numpyTensorB = torch.tensor(numpyArray)
    print("numpyTensorB: ", numpyTensorB)

2.3 更多函数使用

PyTorch除了上面常用的torch.tensor创建张量函数外,还提供了很多便捷函数类创建张量,常用函数使用如下:

import torch

# -------------------- 特殊张量 --------------------
# 创建指定形状的全零张量
zeroTensor = torch.zeros((23))

# 创建指定形状的全一张量
oneTensor = torch.ones((23))

# 创建指定形状的单位矩阵
eyeTensor = torch.eye(3)

# 创建未初始化的张量
uninitializedTensor = torch.empty((23))

# -------------------- END --------------------


# -------------------- 数学张量 --------------------
# 创建等差数列张量
arithmeticTensor = torch.arange(1102)

# 创建随机张量(均匀分布)
randTensor = torch.rand((23))

# 创建正态分布张量
randnTensor = torch.randn((23))

# 创建指定范围内的均匀分布张量
linspaceTensor = torch.linspace(015)
# -------------------- END --------------------

# -------------------- 模仿创建 --------------------
# 原始张量
originalTensor = torch.tensor([[12], [34]])

# 创建与原始张量,形状一致,值都是0的张量
zerosLikeTensor = torch.zeros_like(originalTensor)

# 创建与原始张量,形状一致,值都是1的张量
onesLikeTensor = torch.ones_like(originalTensor)
# -------------------- END --------------------

3.张量访问

PyTorch 中,张量的常见访问方式包括索引、切片、以及一些常用的方法。以下是部分的代码示例:

3.1 使用索引

import numpy as np
import torch

if __name__ == "__main__":
    # 基于numpy创建多维张量
    npArray = np.arange(12).reshape(34)
    npTensor = torch.tensor(npArray)
    print("多维张量:\n", npTensor)

    # 使用索引访问
    print("访问索引=0:", npTensor[0])
    print("访问索引=1:", npTensor[1])
    # 访问单个元素
    print("访问单个元素[0,2]:", npTensor[02])
    print("访问单个元素[1,2]:", npTensor[12])
    print("访问单个元素[2,2]:", npTensor[22])
    
"""
多维张量:
 tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
访问索引=0: tensor([0, 1, 2, 3])
访问索引=1: tensor([4, 5, 6, 7])
访问单个元素[0,2]: tensor(2)
访问单个元素[1,2]: tensor(6)
访问单个元素[2,2]: tensor(10)
"""

3.2 使用切片

import numpy as np
import torch

if __name__ == "__main__":
    # 基于numpy创建多维张量
    npArray = np.arange(15).reshape(53)
    npTensor = torch.tensor(npArray)
    print("多维张量:\n", npTensor)

    # 根据范围访问行数
    print("访问 npTensor[:2]: \n", npTensor[:2])
    print("访问 npTensor[1:3] \n", npTensor[1:3])
    # 访问具体行
    print("访问第一行: ", npTensor[0, :])
    # 访问具体列
    print("访问第二列: ", npTensor[:, 1])
    # 获取部分张量,从第二行开始(索引为1),取每行的前两列(索引为:2)
    print("获取部分张量: \n", npTensor[1:, :2])
    # 使用步长获取数据
    print("访问偶数列: \n", npTensor[::2])
    
"""
多维张量:
 tensor([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11],
        [12, 13, 14]])
访问 npTensor[:2]: 
 tensor([[0, 1, 2],
        [3, 4, 5]])
访问 npTensor[1:3] 
 tensor([[3, 4, 5],
        [6, 7, 8]])
访问第一行:  tensor([0, 1, 2])
访问第二列:  tensor([ 1,  4,  7, 10, 13])
获取部分张量: 
 tensor([[ 3,  4],
        [ 6,  7],
        [ 9, 10],
        [12, 13]])
访问偶数列:
 tensor([[ 0,  1,  2],
        [ 6,  7,  8],
        [12, 13, 14]])
"""

4.张量运算

4.1 基本运算

import torch

if __name__ == "__main__":
    # 创建两个张量
    tensorA = torch.tensor([[12], [34]])
    tensorB = torch.tensor([[56], [78]])

    # 加法
    sumResult = tensorA + tensorB
    print("加法:\n", sumResult)

    # 减法
    subtraction_result = tensorA - tensorB
    print("减法:\n", subtraction_result)

    # 乘法(逐元素相乘)
    multiplyResult = tensorA * tensorB
    print("乘法: \n", multiplyResult)

    # 除法(逐元素相除)
    divideResult = tensorA / tensorB
    print("除法: \n", divideResult)
    
"""
加法:
 tensor([[ 6,  8],
        [10, 12]])
减法:
 tensor([[-4, -4],
        [-4, -4]])
乘法: 
 tensor([[ 5, 12],
        [21, 32]])
除法: 
 tensor([[0.2000, 0.3333],
        [0.4286, 0.5000]])
"""

4.2 统计运算

import torch
import numpy as np

if __name__ == "__main__":
    # 创建张量
    numpyArray = np.arange(12).reshape((34))
    tensorData = torch.tensor(numpyArray)
    print("原始数据:\n", tensorData)

    # 求和
    sumTensor = torch.sum(tensorData)
    print("求和:", sumTensor)
    # 平均值
    meanTensor = torch.mean(tensorData.float())
    print("平均值:", meanTensor)

    # 转换为浮点数类型
    # 标准差和方差仅支持浮点数和复数类型的张量,不支持整数类型的张量。在进行这两个操作之前,需要将张量的数据类型转换为浮点数或复数类型。
    tensorFloat = tensorData.float()
    # 标准差
    stdTensor = torch.std(tensorFloat)
    print("标准差:", stdTensor.item())
    # 方差
    varianceTensor = torch.var(tensorFloat)
    print("方差:", varianceTensor.item())

    # 最大值
    maxTensor = torch.max(tensorData)
    print("最大值:", maxTensor.item())

    # 最小值
    minTensor = torch.min(tensorData)
    print("最小值:", minTensor.item())

    # 按维度进行统计运算
    dimSumTensor = torch.sum(tensorData, dim=0)
    print("计算每列(dim=0)的和: \n", dimSumTensor)

    dimMeanTensor = torch.mean(tensorFloat, dim=0)
    print("计算每列(dim=0)的平均值: \n", dimMeanTensor)
    
    
"""
原始数据:
 tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
求和: tensor(66)
平均值: tensor(5.5000)
标准差: 3.605551242828369
方差: 13.0
最大值: 11
最小值: 0
计算每列(dim=0)的和: 
 tensor([12, 15, 18, 21])
计算每列(dim=0)的平均值: 
 tensor([4., 5., 6., 7.])
"""

4.3 矩阵运算

import torch
if __name__ == "__main__":
    # 创建一个二维张量(矩阵)
    matrix_a = torch.tensor([[123], [456], [789]])
    # 转置
    transposed_matrix_a = matrix_a.T
    print("转置:\n", transposed_matrix_a)
    # 矩阵乘法
    matrix_b = torch.tensor([[201], [123], [456]])
    matrix_multiply_result = torch.matmul(matrix_a, matrix_b)
    print("矩阵乘法:\n", matrix_multiply_result)
    
"""
转置:
 tensor([[1, 4, 7],
        [2, 5, 8],
        [3, 6, 9]])
矩阵乘法:
 tensor([[16, 19, 25],
        [37, 40, 55],
        [58, 61, 85]])
"""

本文由 mdnice 多平台发布

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

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

相关文章

Apache 辅助系统工具

一丶Apache Sqoop 1.Sqoop的介绍: Sqoop的工作机制是将导入或者导出的命令翻译成MapReduce实现,Sqoop可以理解为:SQL到Hadoop或者Hadoop到SQL 2.Sqoop的安装 配置文件修改: cd $SQOOP_HOME/conf mv sqoop-env-template.sh sqo…

VLM 系列——Monkey——论文解读

一、概述 1、是什么 Monkey 全称《Monkey : Image Resolution and Text Label Are Important Things for Large Multi-modal Models》,是一个多模态的视觉-文本模型,当前版本(20231130)为基于Qwen-vl 的三阶段微调(增加了Lora+visual adapter 支持更高的分辨率)可以完成…

Dubbo Consumer 对Provider的protocol选择逻辑

一、简介 dubbo consumer 如果没有指定protocol参数,默认会将provider注册的protocol provider url都获取并转换为Invoker放到Directory中。如果consumer指定了protocol则会在Directory中选择相应的protocol provider url转换为Invoker放在Directory中。 二、代码分…

【Linux笔记】编wpa_supplicantl库

说明、编译当前库需要进行三个步骤 一、编译libnl库 【博主使用的版本 libnl-3.5.0 】 二、编译openssl库 【 博主使用的版本 libopenssl-1.1.1k 】 三、编译wpa_supplicantl库 【 博主使用的版本 wpa_supplicant-2.9】 四、 /博主当前交叉编译器为 【arm-himix100-linux- 】 …

力扣hot100 柱状图中最大的矩形 单调栈

Problem: 84. 柱状图中最大的矩形 文章目录 思路复杂度Code 思路 👨‍🏫 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public static int largestRectangleArea(int[] height){Stack&l…

【英语趣味游戏】填字谜(Crossword)第1天

谜题出处 柯林斯字谜大全(6),Collins——Big Book of Crosswords(Book 6) Puzzle Number: 114 本期单词 横向 1、Situation involving danger (4) 包含危险的情境,4个字母 答案:Risk&#xff…

shell

目录 一.运行方式 二.编程习惯 三.变量 3.1变量的命名 3.3普通变量(局部变量) 3.4特殊变量 3.5变量子串 3.6变量赋值 四.运算方式 4.1$(( )) 4.2let 4.3expr 4.4bc(小数运算) 4.5$[ ] 4.6awk 4.7总结运算方式 五.条件测试语句 5.1文件 5.2条件测试表达式…

揭秘IP地址定位:了解如何通过IP地址追踪你的位置

在互联网时代,我们的每一次在线活动都留下了痕迹,而IP地址则是其中一个关键的标识。IP地址定位技术的发展使得我们能够通过IP地址追踪设备的位置,这在某些情况下对于服务提供商、广告商和甚至研究人员来说可能是有用的。本文将深入探讨IP地址…

webassembly003 whisper.cpp的python绑定实现+Cython+Setuptools的GUI程序

CODE python端的绑定和本文一样,还需要将cdef char* LANGUAGE b’en’改为中文zh(也可以在函数中配置一个参数修改这个值)。ps:本来想尝试cdef whisper_context* whisper_init_from_file_with_params_no_state(char*, whisper_full_params)…

Nginx中的反向代理、正向代理和透明代理的深入讲解

Nginx中的反向代理、正向代理和透明代理 Nginx中的反向代理、正向代理和透明代理是三种常见的代理技术,它们各自具有不同的功能和使用场景。本文将详细介绍这三种代理技术的配置和使用。 一、反向代理 反向代理是指将客户端请求转发到后端服务器,并将…

构建中国人自己的私人GPT—支持中文

上一篇已经讲解了如何构建自己的私人GPT,这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型,GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品,llama.cpp 不再…

数字图像处理(实践篇)二十八 使用OpenCV Python中的K-means对图像进行颜色量化处理

目录 1 颜色量化 2 实践 在某些时候,不可避免的某些设备只能生成有限数量的颜色。因此需要执行颜色量化。选择使用cv2.kmeans()函数对颜色量化应用k-means聚类。 1 颜色量化 使用K-means聚类在图像中实现颜色量化的步骤如下: ① 导入依赖库

写静态页面——魅族导航_前端页面练习

0、效果&#xff1a; 1、html代码&#xff1a;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

Tomcat session复制及session共享技术

目录 1、环境 2、配置测试页面 3、配置session共享 前言&#xff1a; 为什么要做session复制或共享 实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享&#xff0c;以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因&#x…

类和对象 第五部分第五小节:关系运算符重载

作用&#xff1a;重载关系运算符&#xff0c;可以让两个自定义类型对象进行对比操作 初始代码操作&#xff1a;判断p1和p2是否相等 这边会报错&#xff0c;显示没有与这些操作数相匹配的“”符号&#xff0c;因此我们需要构造一个重载关系运算符成员函数 如果为其它关系运算符则…

VUE---项目打包

当项目做完&#xff0c;要 执行 npm run build 打包最终的结果&#xff08;最终的结果会打包进dist文件夹&#xff09;。 一、配置 在vue.config.js中添加以下内容&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileD…

解决ubuntu启动卡住报错:a start job is running for wait

一台测试用的服务器&#xff0c;每次启动都要卡在一个地方好几分钟&#xff0c;因为不常用&#xff0c;也就没管它。 近两天使用它测试&#xff0c;每次开机太浪费时间了&#xff0c;就去找原因和解决的方法。 首先将报错找出来&#xff0c;对照着敲到百度&#xff1a;a start …

[BUUCTF 2018]Online Tool(特详解)

这段代码块检查请求中是否设置了HTTP_X_FORWARDED_FOR头部。如果设置了&#xff0c;它将REMOTE_ADDR设置为HTTP_X_FORWARDED_FOR的值。这通常用于处理Web服务器位于代理后面的情况。 如果URL中未设置host参数&#xff0c;它使用highlight_file(__FILE__);来显示PHP文件的源代码…

uni-app 开发

一、uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架 。开发者编写一套代码&#xff0c;可发布到 iOS 、 Android 、 H5 、以及各种小程序&#xff08;微信 / 支付宝 / 百度 / 头条 /QQ/ 钉钉 / 淘宝&#xff09;、快应用等多个平台。 详细的 uni-app 官方…

ElasticSearch 8.x 使用 snapshot(快照)进行数据迁移

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…