自学内容网 自学内容网

Torch基础1

目录

1.Tensor概述

1.1概念

1.2特点

1.3数据类型

2.Tensor的创建

2.1基本创建方式

2.1.1 torch.tensor()

2.1.2 torch.Tensor()

2.1.3 创建指定类型的张量

2.2创建线性和随机张量

2.2.1 创建线性张量

2.1.2 随机张量

2.3创特殊张量

2.3.1创建全0张量

2.3.2创建全1张量

2.3.3创建指定值张量

2.3.4创建单位矩张量

3.Tensor常见属性

4.切换设备

4.1 tensor.to()

4.2 tensor.cuda()

4.3 创建在GPU上

5.类型转换

5.1 type()

5.2 使用类型方法

6.Tensor数据转换

6.1Tensor与Numpy

6.1.1张量转Numpy

6.1.2Numpy转张量

6.2 Tensor与图像

6.2.1 图片转Tensor

6.2.2 Tensor转图片

6.3 PyTorch图像处理


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)!