Torch基础1
目录
1.Tensor概述
PyTorch会将数据封装成张量(Tensor)进行计算,所谓张量就是元素为相同类型的多维矩阵。
张量可以在 GPU 上加速运行。
1.1概念
张量是一个多维数组,通俗来说可以看作是扩展了标量、向量、矩阵的更高维度的数组。张量的维度决定了它的形状(Shape),例如:
-
标量 是 0 阶张量,只有大小没有方向(温度,高度),如
a = torch.tensor(5)
-
向量 是 1 阶张量,具有大小和方向(加速度,力),如
b = torch.tensor([1, 2, 3])
-
2维矩阵 是 2 阶张量,线性变换(旋转矩阵,位移矩阵),,如
c = torch.tensor([[1, 2], [3, 4]])
-
更高维度的张量,如3维、4维等,通常用于表示图像、视频数据等复杂结构。
1.2特点
-
动态计算图:PyTorch 支持动态计算图,这意味着在每一次前向传播时,计算图是即时创建的。
-
GPU 支持:PyTorch 张量可以通过
.to('cuda')
移动到 GPU 上进行加速计算。 -
自动微分:通过
autograd
模块,PyTorch 可以自动计算张量运算的梯度,这对深度学习中的反向传播算法非常重要。
1.3数据类型
PyTorch中有9种数据类型:浮点数(8位、16位、32位、64位 )、整数(8位、16位、32位、64位 )、布尔。
2.Tensor的创建
2.1基本创建方式
2.1.1 torch.tensor()
(1)标量创建tensor
import torch
import numpy as np
data=torch.tensor(5)
print(data)
print(data.shape)
(2)随机数组创建tensor
data = np.random.randn(3,4)
data = torch.tensor(data)
print(data)
print(data.shape)
print(data.dtype)
(3)list创建tensor
data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
data = torch.tensor(data)
print(data)
print(data.shape)
print(data.dtype)
2.1.2 torch.Tensor()
既可根据形状创建张量,其可用指定数据的创建张量。
tensor1 = torch.Tensor(2,3)
tensor2 = torch.Tensor([[1,2,3],[4,5,6]])
tensor3 = torch.Tensor([[10]])
print(tensor1)
print()
print(tensor2)
print(tensor2.shape)
print(tensor2.dtype)
print()
print(tensor3)
print(tensor3.shape)
print(tensor3.dtype)
2.1.3 创建指定类型的张量
tensor1 = torch.ShortTensor(3,3)
tensor2 = torch.IntTensor(2,2)
tensor3 = torch.LongTensor(3,3)
tensor4 = torch.HalfTensor(3,3)
tensor5 = torch.FloatTensor(3,3)
tensor6 = torch.DoubleTensor(3,3)
tensor7 = torch.BoolTensor(3,3)
# 常用创建tensor的方式
# 因为指定了类型,tensor中的数据若不符合指定类型则被转化
tensor8 = torch.tensor([5,10,257],dtype=torch.int8,device='cuda:0')
print(tensor1)
print(tensor1.shape)
print(tensor1.dtype)
print()
print(tensor2)
print(tensor2.shape)
print(tensor2.dtype)
print()
print(tensor3.dtype)
print()
print(tensor4.dtype)
print()
print(tensor5.dtype)
print()
print(tensor6)
print(tensor6.shape)
print(tensor6.dtype)
print()
print(tensor7)
print(tensor7.shape)
print(tensor7.dtype)
print()
print(tensor8)
print(tensor8.shape)
print(tensor8.dtype)
2.2创建线性和随机张量
2.2.1 创建线性张量
(1)torch.arange()
# 步长:2,范围[0,10)
r1 = torch.arange(0,10,2)
print(r1)
(2)torch.linspace()
在指定空间按照元素个数生成张量:等差。差=(end-start)/(step-1)
r2 = torch.linspace(start=3,end=10,steps=10)
print(r2)
(3)torch.logspace()
在指定空间按照元素个数生成张量:等比。比=(base的start次方/base的min次方)开(num-1)次方
# 在2的3次方 到 2的10次方 之间 生成等比数列
r3 = torch.logspace(start=3,end=10,steps=5,base=2)
print(r3)
2.1.2 随机张量
随机数种子
随机数种子(Random Seed)是一个用于初始化随机数生成器的数值。随机数生成器是一种算法,用于生成一个伪随机的数列,但如果使用相同的种子进行初始化,生成器将产生相同的数列。
随机张量
在 PyTorch 中,种子影响所有与随机性相关的操作,包括张量的随机初始化、数据的随机打乱、模型的参数初始化等。通过设置随机数种子,可以做到模型训练和实验结果在不同的运行中进行复现。
torch.manual_seed(54)
# 获取随机数种子
print(torch.initial_seed())
tensor1 = torch.rand(3,4)
print(tensor1)
# 标准正态分布
tensor2 = torch.randn(3,4)
print(tensor2)
# 原生服从正态分布,均值为:2,方差为:3,形状为:3行,4列的tensor
tensor3 =torch.normal(mean=2,std=3,size=(3,4))
print(tensor3)
2.3创特殊张量
2.3.1创建全0张量
import torch
import numpy as np
data = torch.zeros(2,3)
print(data)
print(data.dtype)
mask = np.ones((3,4))
print(mask)
# 与mask的形状一样
data = torch.zeros_like(torch.tensor(mask))
print(data)
2.3.2创建全1张量
data = torch.ones(2,3)
print(data)
print(data.dtype)
mask = np.ones((3,4))
print(mask)
# 与mask的形状一样
data = torch.ones_like(torch.tensor(mask))
print(data)
2.3.3创建指定值张量
data = torch.full((2,2),fill_value=8)
print(data)
print(data.dtype)
mask = np.ones((3,4))
print(mask)
# 与mask的形状一样
data = torch.full_like(torch.tensor(mask),fill_value=6)
print(data)
2.3.4创建单位矩张量
data = torch.eye(3,3,device='cuda')
print(data)
print(data.dtype)
3.Tensor常见属性
data.dtype | 数据类型 |
data.device | 运行设备 |
data.shape | 张量形状 |
tensor1 =torch.tensor([1,2,3])
print(tensor1.shape)
print(tensor1.dtype)
print(tensor1.device)
4.切换设备
默认在cpu上运行,可以显式的切换到GPU:不同设备上的数据不能相互运算。
4.1 tensor.to()
tensor1 =torch.tensor([1,2,3])
print(tensor1.device)
device = "cuda" if torch.cuda.is_available() else 'cpu'
tensor1 =tensor1.to(device)
print(tensor1.device)
4.2 tensor.cuda()
tensor1 =torch.tensor([1,2,3])
print(tensor1.device)
tensor1 =tensor1.cuda()
print(tensor1.device)
4.3 创建在GPU上
tensor1 =torch.tensor([1,2,3],device='cuda:0')
print(tensor1.device)
5.类型转换
5.1 type()
tensor1 = torch.tensor([10,20,30])
print(tensor1.dtype)
# 1. 使用type()进行类型转换
tensor2=tensor1.type(torch.float32)
print(tensor2.dtype)
tensor3=tensor1.type(torch.half)
print(tensor3.dtype)
tensor4=tensor1.type(torch.int64)
print(tensor4.dtype)
print()
5.2 使用类型方法
tensor1 = torch.tensor([10,20,30])
print(tensor1.dtype)
# 2. 使用其他方法进行类型转换
tensor5 = tensor1.half()
print(tensor5.dtype)
tensor6 = tensor1.float()
print(tensor6.dtype)
tensor7 = tensor1.double()
print(tensor7.dtype)
tensor8 = tensor1.short()
print(tensor8.dtype)
tensor9 = tensor1.int()
print(tensor9.dtype)
tensor10 = tensor1.long()
print(tensor10.dtype)
tensor10 = tensor1.bool()
print(tensor10.dtype)
6.Tensor数据转换
6.1Tensor与Numpy
6.1.1张量转Numpy
(1)浅拷贝,(tensor.numpy())
tensor1 =torch.ones((3,4))
print(tensor1)
print(tensor1.dtype)
arr = tensor1.numpy()
print(arr)
print(arr.dtype)
arr[0][0]=88
print(tensor1)
print(arr)
(2)深拷贝,(tensor.numpy().copy())
tensor1 =torch.ones((3,4))
print(tensor1)
print(tensor1.dtype)
arr1 =tensor1.numpy()
arr2 = arr1.copy()
print(arr2)
print(arr2.dtype)
tensor1[0][0]=88
print(tensor1)
print(arr1)
print(arr2)
6.1.2Numpy转张量
(1)浅拷贝,(torch.from_array(arr))
arr = np.zeros([3,3])
print(arr)
ten = torch.from_numpy(arr)
print(ten)
print(arr.dtype,ten.dtype)
print()
ten[0][0]=1
print(arr)
print(ten)
(2)深拷贝,(torch.tensor())
arr = np.zeros([3,3])
print(arr)
ten = torch.tensor(arr)
print(ten)
print(arr.dtype,ten.dtype)
print()
ten[0][0]=1
print(arr)
print(ten)
6.2 Tensor与图像
6.2.1 图片转Tensor
import torch
from PIL import Image
from torchvision import transforms
img_path = 'test.png'
# 读取图片
img =Image.open(img_path)
#地址
print(img)
# 将图像转换为张量
# 创建一个转换器
transform = transforms.ToTensor()
img_tensor = transform(img)
print(img_tensor)
print(img_tensor.shape)
6.2.2 Tensor转图片
# 雪花
img_tensor = torch.rand((3,224,224),device='cuda')
# 四通道,[[R][G][B][A]]
# 马赛克
# img_tensor = torch.full((4,200,200),fill_value=0.0,device='cuda')
# 白色
# img_tensor = torch.full((4,200,200),fill_value=1.0,device='cuda')
# img_tensor = torch.full((3,200,200),fill_value=1.0,device='cuda')
# 黑色
# img_tensor = torch.full((3,200,200),fill_value=0.0,device='cuda')
# 创建转化器
transformer = transforms.ToPILImage()
img = transformer(img_tensor)
img.show()
img.save('save.png')
6.3 PyTorch图像处理
img_path = '1.png'
# 用PIL加载图片
img = Image.open(img_path)
# 转换为tensor
transfer = transforms.ToTensor()
img_tensor = transfer(img)
# 去除透明度,四通道,[[R][G][B][A]]
img_tensor = img_tensor[:4]
print(img_tensor.shape)
# 用GPU读取图片
if torch.cuda.is_available():
img_tensor = img_tensor.cuda()
print(img_tensor.device)
# 图像处理:修改像素值
img_tensor +=0.2
# 将tensor 移回 CPU 并转回 PIL图像
img_tensor = img_tensor.cpu()
transfer2 = transforms.ToPILImage()
img = transfer2(img_tensor)
img.show()
原文地址:https://blog.csdn.net/adc_abc123/article/details/143920450
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!