深度学习:张量标量概念、PyTorch张量创建、类型转换等

前言:前一篇文章介绍了PyTorch概念,此次介绍PyTorch的API

本文目录:

  • 一、张量和标量
  • 二、PyTorch创建张量
    • [(一)根据torch.tensor(data=, dtype=) 根据指定数据创建张量;](#(一)根据torch.tensor(data=, dtype=) 根据指定数据创建张量;)
    • [(二)torch.Tensor(size=) 根据形状创建张量, 其也可用来创建指定数据或者指定类型的张量;](#(二)torch.Tensor(size=) 根据形状创建张量, 其也可用来创建指定数据或者指定类型的张量;)
    • [(三)torch.arange(start=, end=, step=):固定步长线性张量;torch.linspace(start=, end=, steps=):固定元素数线性张量;](#(三)torch.arange(start=, end=, step=):固定步长线性张量;torch.linspace(start=, end=, steps=):固定元素数线性张量;)
    • [(四)torch.randn/rand(size=) 创建随机浮点类型张量;torch.randint(low=, high=, size=) 创建随机整数类型张量,左闭右开;torch.initial_seed() 和 torch.manual_seed(seed=) 随机种子设置;](#(四)torch.randn/rand(size=) 创建随机浮点类型张量;torch.randint(low=, high=, size=) 创建随机整数类型张量,左闭右开;torch.initial_seed() 和 torch.manual_seed(seed=) 随机种子设置;)
    • [(五)torch.zeros(size=) 和 torch.zeros_like(input=) 创建全0张量;](#(五)torch.zeros(size=) 和 torch.zeros_like(input=) 创建全0张量;)
    • [(六)torch.ones(size=) 和 torch.ones_like(input=) 创建全1张量;](#(六)torch.ones(size=) 和 torch.ones_like(input=) 创建全1张量;)
    • [(七)torch.full(size=, fill_value=) 和 torch.full_like(input=, fill_value=) 创建全为指定值张量;](#(七)torch.full(size=, fill_value=) 和 torch.full_like(input=, fill_value=) 创建全为指定值张量;)
  • 三、类型转换

一、张量和标量

张量和标量是深度学习和科学计算中最基本的数据表示形式,它们之间有着明确的区别和联系。

张量

元素为同一种数据类型的多维矩阵,与NumPy数组类似,张量既有数值,也有方向,可以看做是标量的高维扩展。

标量

标量是零维的单个数值,没有方向,只有大小。

标量与张量的关系

二、PyTorch创建张量

(一)根据torch.tensor(data=, dtype=) 根据指定数据创建张量;

复制代码
import numpy as np
# 导入torch库,用于创建和操作张量
import torch

# 创建并打印各种形状和类型的张量
print(torch.tensor(10))
print(torch.tensor([10],dtype=torch.int))
print(torch.tensor([[10]]))
print(torch.tensor([[[10]]]))
print(torch.tensor([[10,20],[30,40]]))

# 从numpy数组创建并打印张量
print(torch.tensor(np.array([[10,20],[30,40]])))

(二)torch.Tensor(size=) 根据形状创建张量, 其也可用来创建指定数据或者指定类型的张量;

复制代码
# 创建并打印各种形状的浮点数张量
print(torch.Tensor(5))# 指定形状,多的'.'代表浮点,生成5个0
print(torch.Tensor(2,3))# 指定形状,生成2行3列0(浮点数)
print(torch.Tensor(size=(2,3)))   #指定size
# 计算并打印张量的维度
print(torch.Tensor([10]).ndim)
print(torch.Tensor([[[10]]]).ndim)

# 通过列表和numpy数组创建并打印张量
print(torch.Tensor([[10,20],[30,40]]))
print(torch.Tensor(np.array([[10,20],[30,40]])))

# 使用指定的数据类型创建并打印张量
print(torch.IntTensor([[10.2,20.7],[30.5,40.9]]))# 输出10,20,30,40,int32
print(torch.FloatTensor([[10,20],[30,40]]))# 输出10,20,30,40,float32
print(torch.LongTensor([[10,20],[30,40]]))# int64
print(torch.ShortTensor([[10,20],[30,40]]))# int16
print(torch.ByteTensor([[10,20],[30,40]]))# uint8
print(torch.HalfTensor([[10,20],[30,40]]))# float16

(三)torch.arange(start=, end=, step=):固定步长线性张量;torch.linspace(start=, end=, steps=):固定元素数线性张量;

复制代码
# 1. 在指定区间按照步长生成元素 [start, end, step) 左闭右开
data = torch.arange(0, 10, 2)
print(data)

# 2. 在指定区间按照元素个数生成 [start, end, steps] 左闭右闭
# step = (end-start) / (steps-1)
# value_i = start + step * i
data = torch.linspace(0, 9, 10)
print(data)

(四)torch.randn/rand(size=) 创建随机浮点类型张量;torch.randint(low=, high=, size=) 创建随机整数类型张量,左闭右开;torch.initial_seed() 和 torch.manual_seed(seed=) 随机种子设置;

复制代码
# 1. 创建随机张量
data = torch.randn(2, 3)  # 创建2行3列张量
print(data)
# 查看随机数种子
print('随机数种子:', torch.initial_seed())

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

(五)torch.zeros(size=) 和 torch.zeros_like(input=) 创建全0张量;

复制代码
# 1. 创建指定形状全0张量
data = torch.zeros(2, 3)
print(data)

# 2. 根据张量形状创建全0张量
data = torch.zeros_like(data)
print(data)

(六)torch.ones(size=) 和 torch.ones_like(input=) 创建全1张量;

复制代码
# 1. 创建指定形状全1张量
data = torch.ones(2, 3)
print(data)

# 2. 根据张量形状创建全1张量
data = torch.ones_like(data)
print(data)

(七)torch.full(size=, fill_value=) 和 torch.full_like(input=, fill_value=) 创建全为指定值张量;

复制代码
# 1. 创建指定形状指定值的张量
data = torch.full([2, 3], 10)
print(data)

# 2. 根据张量形状创建指定值的张量
data = torch.full_like(data, 20)
print(data)

三、类型转换

(一)张量类型转换

复制代码
#类型转换
data=torch.rand(2,3)
print(data.dtype)
#类型转换方式1
print(data.type(torch.int32))
print(data.type(torch.float32))
print(data.type(torch.int64))
print(data.type(torch.int16))
print(data.type(torch.int8))
print(data.type(torch.uint8))

#类型转换方式2
print(data.type(torch.double))
print(data.type(torch.long))
print(data.type(torch.short))
print(data.type(torch.half))
print(data.type(torch.bool))
#类型转换方式3
print(data.type(torch.ShortTensor))
print(data.type(torch.FloatTensor))
print(data.type(torch.LongTensor))
print(data.type(torch.IntTensor))
print(data.type(torch.DoubleTensor))
print(data.type(torch.HalfTensor))

(二)张量、标量和numpy相互转换

复制代码
#标量转numpy
print(data.numpy())

#numpy转张量,共享内存,但id不同
n1=np.array([1,2,3])
print(n1,id(n1))
t1=torch.from_numpy(n1)
print(t1,id(t1))   #n1和t1的id不同
【验证n1和t1是否共享内存:
n1[0] = 100  # 修改 NumPy 数组
print("修改后的 NumPy 数组:", n1)
print("PyTorch 张量是否同步变化:", t1)  # 结果显示:t1同步变为 tensor([100, 2, 3]),说明n1和t1共享内存】

#使用copy不共享内存
n2=np.array([1,2,3])
print(n2,id(n2))
print(torch.from_numpy(n2.copy()),id(torch.from_numpy(n2.copy())))  

#张量转标量
n3=3
print(torch.tensor(n3).item())  #先将3转为张量,再转为了标量;单数值numpy转标量也可用item()

#标量转张量
print(torch.tensor(3))   #标量3被转为张量

今天的分享到此结束。

相关推荐
爱分享的飘哥25 分钟前
第三十七章:文生图的炼金术:Stable Diffusion完整工作流深度解析
人工智能·pytorch·stable diffusion·文生图·ai绘画·代码实战·cfg
宸津-代码粉碎机2 小时前
LLM 模型部署难题的技术突破:从轻量化到分布式推理的全栈解决方案
java·大数据·人工智能·分布式·python
乌恩大侠7 小时前
自动驾驶的未来:多模态传感器钻机
人工智能·机器学习·自动驾驶
光锥智能8 小时前
AI办公的效率革命,金山办公从未被颠覆
人工智能
GetcharZp9 小时前
爆肝整理!带你快速上手LangChain,轻松集成DeepSeek,打造自己的AI应用
人工智能·llm·deepseek
猫头虎9 小时前
新手小白如何快速检测IP 的好坏?
网络·人工智能·网络协议·tcp/ip·开源·github·php
GeeJoe10 小时前
凡人炼丹传之 · 我让 AI 帮我训练了一个 AI
人工智能·机器学习·llm
小和尚同志10 小时前
Dify29. 为你的 Dify API 穿层衣服吧
人工智能·aigc
不会学习的小白O^O10 小时前
神经网络----卷积层(Conv2D)
人工智能·深度学习·神经网络
bastgia10 小时前
Transformer终结者?Google DeepMind新架构实现2倍推理速度和一半内存占用
人工智能·llm