Pytorch入门——Tensor的基本操作

部署运行你感兴趣的模型镜像

*前序知识:Python的基本语法、操作和控制结构;库函数的基本使用方法。
*本文将在给出中文名称的同时,附上英文词汇。
*所有英文缩写将在第一次出现时注明。
*Package version:Python==3.8.20;pyorch==2.4.1;numpy==1.24.4。

Pytorch是深度学习中常用的库之一。从本文开始,博主计划用一个专栏来更新有关Pytorch的基本操作。作为自己的笔记以便查阅的同时,也希望给初入人工智能领域的萌新们一些帮助~

注:当开始使用深度学习的框架时,建议使用anaconda新建虚拟环境,以免出现不同库之间的、相同库不同版本间的兼容问题。anaconda安装环境的教程CSDN上比较多,这里就不作赘述了。

Tensor 简介

 在PyTorch中,张量(Tensor)是一个基本的数据结构。

  1. N维数组:Tensor是一个多维数组(类似于 NumPy 数组)。一个 Tensor可以是向量(1D)、矩阵(2D)、高维数组(3D 等)。
  2. 支持自动求导:Tensor是PyTorch中构建神经网络的基本元素,具有自动求导的能力,可以帮助计算梯度。
  3. GPU 加速:Tensor支持在 GPU 上进行计算(CUDA)。

 接下来,我们将基于具体的代码,分别讨论Pytorch中Tensor的主要操作。

示例(Coding)

导入Pytorch和Numpy库

  同时导入numpy,并不是因为二者存在直接依赖,而是因为torch中的tensor数据结构与numpy可以互相转换。

import torch
import numpy as np

Tensor数据结构的创建

列表(List)转换为Tensor
# 创建一个列表 (list)
data_01 = [[1,2],[3,4]]

# 将列表转换为张量 (tensor)
x_tensor_01 = torch.tensor(data_01)

print(x_tensor_01)

程序输出:
在这里插入图片描述

numpy数组转换为Tensor
data_02 = [[5,6],[7,8]]

# 将列表转换为numpy数组 (numpy array)
x_numpy = np.array(data_02)

# 将numpy数组转换为张量 (tensor)
x_tensor_02 = torch.from_numpy(x_numpy)

print(f"n: {x_numpy}")
print(f"t: {x_tensor_02}")

程序输出:
在这里插入图片描述

numpy数组与Tensor的同时改变
data_02 = [[5,6],[7,8]]

# 将列表转换为numpy数组 (numpy array)
x_numpy = np.array(data_02)

# 将numpy数组转换为张量 (tensor)
x_tensor_02 = torch.from_numpy(x_numpy)

# 改变numpy数组的内容
np.add(x_numpy, 1, out=x_numpy)

# 因为x_tensor_02使用torch.from_numpy(),因此numpy的改变也会映射到张量上
print(f"n: {x_numpy}")
print(f"t: {x_tensor_02}")

程序输出:
在这里插入图片描述

Pytorch内部函数直接创建Tensor
# 创建一个全1的张量 (tensor),大小与输入张量相同
x_ones = torch.ones_like(x_tensor_01)
print(f"Ones Tensor: \n {x_ones} \n")

# 创建一个随机内容的张量 (tensor),大小与输入张量相同
x_rand = torch.rand_like(x_tensor_01, dtype=torch.float) # dtype参数指定转换后张量的数据类型,默认为输入张量的数据类型![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0989c931d5d94da1b6a2247f2ce920d6.png)

print(f"Random Tensor: \n {x_rand} \n")

程序输出:
在这里插入图片描述

通过元组指定Tensor生成的结构
# 创建一个元组,包含张量的维度(形状)
shape = (4,3,)
print(type(shape))
print("")

rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

程序输出:
在这里插入图片描述

Tensor的属性(Attributes)

x_tensor_03 = torch.rand(4,2)

# 打印张量 (tensor)
print(x_tensor_03)

# 获取张量的形状 (shape)
print(f"Tensor Shape: \n {x_tensor_03.shape} \n")

# 获取张量的数据类型 (dtype)
print(f"Tensor DType: \n {x_tensor_03.dtype} \n")

# 获取张量的设备 (device)
print(f"Tensor Device: \n {x_tensor_03.device} \n")

# 获取张量的元素数量 (numel)
print(f"Tensor Numel: \n {x_tensor_03.numel()} \n")

# 获取张量的维度 (dim)
print(f"Tensor Dim: \n {x_tensor_03.dim()} \n")

# 获取张量的大小 (size)
print(f"Tensor Size: \n {x_tensor_03.size()} \n")

程序输出:
在这里插入图片描述

Tensor的基本操作

Tensor的索引和切片
# 张量 (tensor) 的索引和切片
x_tensor_04 = torch.rand(4, 5)
print(x_tensor_04)

# 打印张量 (tensor)的第一行
print(f"First row: {x_tensor_04[0]}")

# 打印张量 (tensor)的第一列
print(f"First column: {x_tensor_04[:, 0]}")

# 打印张量 (tensor)的最后一列
print(f"Last column: {x_tensor_04[..., -1]}")

# 将张量 (tensor) 的第二列设置为 0
x_tensor_04[:,1] = 0
print(x_tensor_04)

程序输出:
在这里插入图片描述

Tensor的拼接和堆叠
x_tensor_05 = torch.ones(4, 4)

x_tensor_05[:,1] = 0
print(x_tensor_05)
print("")

# 将张量 (tensor) 沿着 "列" 进行拼接 (concatenate)
t1 = torch.cat([x_tensor_05, x_tensor_05, x_tensor_05], dim=1)
print(t1)
print("")

# 将张量沿着 "行" 进行拼接 
t1 = torch.cat([x_tensor_05, x_tensor_05, x_tensor_05], dim=0)
print(t1)
print("")

# 将张量 (tensor) 进行堆叠 (stack)。
t2 = torch.stack((x_tensor_05, x_tensor_05), dim=0)
print(t2)
print("")

# 注意和拼接 (concatenate) 的区别,堆叠会创建一个新的维度,每个张量作为一个新的大张量的子元素。
print(f"T1 Tensor size: {t1.size()}")
print(f"T2 Tensor size: {t2.size()}")

程序输出:
在这里插入图片描述

Tensor的数学运算
x_tensor_06 = torch.rand(3, 4)
print(f"Input tensor x_tensor_06: \n {x_tensor_06} \n")

# 计算tensor矩阵乘法,".T" 表示tensor的转置(参考线性代数知识)
y1 = x_tensor_06 @ x_tensor_06.T

# 计算tensor矩阵乘法,".matmul()" 表示tensor的矩阵乘法,与 "@"效果一样
y2 = x_tensor_06.matmul(x_tensor_06.T)

# 随机生成一个与y1大小相同的张量
y3 = torch.rand_like(y1)

# 计算x_tensor_06和其转置的矩阵乘法,并将结果赋值给y3
torch.matmul(x_tensor_06, x_tensor_06.T, out=y3)
print(f"Matrix multiplication of x_tensor_06 and its transpose: \n {y1} \n {y2} \n {y3} \n")

# 计算tensor内元素间的乘积,"mul()" 表示tensor的元素乘法,与 "*"效果一样
z1 = x_tensor_06 * x_tensor_06
z2 = x_tensor_06.mul(x_tensor_06)

z3 = torch.rand_like(x_tensor_06)

# 计算tensor内元素间的乘积,并将结果赋值给z3
torch.mul(x_tensor_06, x_tensor_06, out=z3)
print(f"Element-wise multiplication of x_tensor_06: \n {z1} \n {z2} \n {z3} \n")

程序输出:
在这里插入图片描述

Tensor的标矢转换
x_tensor_07 = torch.rand(3, 4)

# 索引张量中的元素
agg = x_tensor_07[0,1]

# 使用item()将张量 (tensor) 转换为标量 (scalar)
agg_item = agg.item()

print(agg, type(agg))
print(agg_item, type(agg_item))

程序输出:
在这里插入图片描述

Tensor的原位计算
x_tensor_08 = torch.rand(3, 4)
print("Input tensor: \n", x_tensor_08)

# 原位计算:将张量 (tensor) 中的所有元素加 5
x_tensor_08.add_(5)
print("Modified tensor: \n", x_tensor_08)

程序输出:
在这里插入图片描述

Tensor数据向GPU转移

tensor = torch.rand(4, 4)

# 将张量 (tensor) 转移到 GPU 上
if torch.accelerator.is_available():    # 检查是否有可用的 GPU  # 这个语句运行会报错,Pytorch==1.9后的版本不再支持
    tensor_gpu = tensor.to(torch.accelerator.current_accelerator())

  只要你安装的是最新的Pytorch包且没有安装其他依赖,这句代码运行时会报错的。这是因为Pytorch==1.9后的版本不再支持直接使用torch.accelerator。
在这里插入图片描述

  可以使用torch.cuda来方便地解决这个问题,如下:

tensor = torch.rand(4, 4)

# 将张量 (tensor) 转移到 GPU 上
if torch.cuda.is_available():    # 检查是否有可用的 GPU
    tensor_gpu = tensor.to(torch.accelerator.current_accelerator())

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值