pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

介绍

PyTorch是使用Python的科学计算库,支持GPU加速的深度学习框架。PyTorch提供了向量(张量),数组和图像的表示和转换,使其易于进行数值计算、线性代数操作和神经网络的构建。

向量(tensor)的定义与创建

定义

在PyTorch中,张量(tensor)是一种特殊的数据结构,可以把多维数组看做张量。可以用于模型的输入输出,如神经网络中的输入图像,输出概率。 PyTorch中的张量可以在CPU和GPU上进行计算,因此可以利用多个GPU进行并行计算。

import torch

import numpy as np

# 创建一个一维张量

a = torch.tensor([1, 2, 3])

print(a) # tensor([1, 2, 3])

# 创建一个二维张量

b = torch.tensor([[1, 2], [3, 4]])

print(b)

# tensor([[1, 2],

# [3, 4]])

# 创建一个随机张量

c = torch.randn(2, 3)

print(c)

# tensor([[-1.8684, -0.5983, 1.8883],

# [ 0.2072, 0.1262, 0.3616]])

转换

PyTorch中也可以将numpy数组转换成张量,或者将张量转换成numpy数组。

# 将numpy数组转换成张量

n = np.array([1, 2, 3])

d = torch.from_numpy(n)

print(d)

# tensor([1, 2, 3])

# 将张量转换成numpy数组

e = d.numpy()

print(e)

# [1 2 3]

图像的处理

加载图片

在PyTorch中,我们可以使用torchvision库加载图片并进行预处理,torchvision包含一些常用的图像数据集和数据变换,如随机翻转,随机裁剪等。

from PIL import Image

import torchvision.transforms as transforms

# 加载图片

img = Image.open("test.jpg")

print(img.format, img.size, img.mode)

# JPEG (420, 400) RGB

# 对图片进行标准化处理

transform = transforms.Compose([

transforms.Resize((224, 224)), # 将图片调整为指定大小

transforms.ToTensor(), # 将图片转换成张量

transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)) # 对每个通道进行标准化处理

])

img_processed = transform(img).unsqueeze(0) # 在第0维添加一个维度

CPU和GPU之间的数据传输

数据类型的转换

在PyTorch中,我们可以使用to()方法在CPU和GPU之间传输数据,也可以使用type()方法转换数据的类型。

# 创建一个CPU张量

x_cpu = torch.randn(2, 3)

print(x_cpu.device) # cpu

# 将CPU张量转换成GPU张量

x_cuda = x_cpu.to('cuda')

print(x_cuda.device) # cuda:0

# 将GPU张量转换成CPU张量

x_cpu = x_cuda.to('cpu')

print(x_cpu.device) # cpu

# 把当前类型改成float16

x_half = x_cpu.type(torch.float16)

运算时的数据类型

在PyTorch中,tensor的默认类型是float32。我们可以使用float16或者float64来进行运算,从而加快计算速度,或者提高精度。

# 将默认类型设置成float16

torch.set_default_dtype(torch.float16)

# 创建一个默认类型的张量

p = torch.tensor([1.0, 2.0, 3.0])

print(p.dtype) # torch.float16

# 将张量的类型设置成float64

q = p.type(torch.float64)

print(q.dtype) # torch.float64

# 将张量的类型设置成float32

r = q.type(torch.float)

print(r.dtype) # torch.float32

数组的处理

数组的转换

在PyTorch中,数组可以通过from_numpy()函数转换成张量。

# 创建一个numpy数组

s = np.array([[1, 2], [3, 4]])

# 将numpy数组转换成张量

t = torch.from_numpy(s)

print(t)

# tensor([[1, 2],

# [3, 4]])

# 将张量转换成numpy数组

u = t.numpy()

print(u)

# [[1 2]

# [3 4]]

数组的运算

在PyTorch中,我们可以使用常见的数学操作,例如加、减、乘、除,以及矩阵的乘法等。

# 创建两个二维张量

v = torch.tensor([[1, 2], [3, 4]])

w = torch.tensor([[5, 6], [7, 8]])

# 张量的加法

x = v + w

print(x)

# tensor([[ 6, 8],

# [10, 12]])

# 张量的减法

y = v - w

print(y)

# tensor([[-4, -4],

# [-4, -4]])

# 张量的按元素乘法

z = v * w

print(z)

# tensor([[ 5, 12],

# [21, 32]])

# 张量的除法

a = v / w

print(a)

# tensor([[0.2000, 0.3333],

# [0.4286, 0.5000]])

# 张量的矩阵乘法

b = torch.mm(v, w)

print(b)

# tensor([[19, 22],

# [43, 50]])

总结

在本文中,我们介绍了如何使用PyTorch中的张量(tensor)、图像、CPU和GPU之间的数据传输、数组,以及如何进行数组的运算。了解了这些操作可以让我们更高效地使用PyTorch构建神经网络,进行深度学习研究。

后端开发标签