介绍
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构建神经网络,进行深度学习研究。