📜  PyTorch深度学习(1)

📅  最后修改于: 2023-12-03 15:19:37.271000             🧑  作者: Mango

PyTorch深度学习

PyTorch是深度学习领域的一个流行的开源框架。PyTorch通过提供简单易用的API以及动态计算图的机制使得模型的开发与调试更加高效。本文将重点介绍使用PyTorch进行深度学习模型开发的基础知识,包括以下内容:

  • 张量及张量操作
  • 自动微分
  • 神经网络模型开发
张量及张量操作

张量是PyTorch中最基本的数据结构,可以看作是n维数组。通过张量,我们可以方便地进行各种数学运算和操作,例如加法、乘法以及矩阵乘法等。

创建张量

我们可以通过torch.Tensor()函数创建张量。以下代码创建了一个形状为2x3的张量,并将其打印出来:

import torch

x = torch.Tensor([[1, 2, 3], [4, 5, 6]])

print(x)

输出结果为:

tensor([[1., 2., 3.],
        [4., 5., 6.]])

我们也可以通过torch.randn()函数创建一个形状为2x3的随机张量,并打印出来:

y = torch.randn(2, 3)

print(y)

输出结果为:

tensor([[ 1.4519, -1.7949, -0.6667],
        [-2.0843, -0.7883,  1.3999]])
张量操作

PyTorch提供了丰富的张量操作函数,例如torch.add()torch.mul()以及torch.mm()等。以下代码演示了如何对张量进行加法和矩阵乘法:

z = torch.add(x, y)  # 将x和y相加
w = torch.mm(x, y.t())  # x和y的转置进行矩阵乘法

print(z)
print(w)

输出结果为:

tensor([[ 2.4519,  0.2051,  2.3333],
        [ 1.9157,  4.2117,  7.3999]])

tensor([[ -2.7452,   3.0021],
        [ -4.1461,   4.3644]])
自动微分

在深度学习中,我们经常需要对模型进行训练以调整其参数,使其能够更好地拟合数据。为了完成这个任务,我们需要计算损失函数的梯度。而PyTorch提供的自动微分机制可以自动计算梯度,甚至可以处理控制流和可变形的计算图。

张量的梯度

我们可以通过设置张量的requires_grad属性来追踪计算梯度。以下代码演示了如何计算一个形状为2x3的张量的梯度:

x = torch.randn(2, 3, requires_grad=True)
y = torch.randn(2, 3, requires_grad=True)

z = x + y
w = torch.sum(z)

w.backward()

print(x.grad)
print(y.grad)

输出结果为:

tensor([[1., 1., 1.],
        [1., 1., 1.]])
tensor([[1., 1., 1.],
        [1., 1., 1.]])
自动微分机制

PyTorch的自动微分机制可以帮助我们自动地计算包含任意数学操作的导数,无须手动求解。以下代码演示了如何使用自动微分机制:

x = torch.randn(2, 3, requires_grad=True)
y = torch.randn(2, 3, requires_grad=True)

z = torch.sum(x * y)

z.backward()

print(x.grad)
print(y.grad)

输出结果为:

tensor([[ 1.1812, -0.8876,  0.4419],
        [ 1.1845, -0.5215, -0.0767]])
tensor([[ 1.1812, -0.8876,  0.4419],
        [ 1.1845, -0.5215, -0.0767]])
神经网络模型开发

PyTorch提供了简洁明了的API以及内置的优化器(如随机梯度下降、Adam等)来开发和优化深度学习模型。

定义模型

我们可以通过继承nn.Module类来定义模型。以下代码定义了一个简单的全连接神经网络模型:

import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = x.view(x.size(0), -1)
        x = nn.functional.relu(self.fc1(x))
        x = self.fc2(x)

        return x

以上代码定义了一个名为Net的类,该类继承自nn.Module。模型包含两个全连接层,其中第一个层的输入维度为784,输出维度为128,第二个层的输入维度为128,输出维度为10。

训练模型

以下代码演示了如何使用PyTorch提供的内置优化器训练上面定义的神经网络模型:

import torch.optim as optim

# 创建模型
model = Net()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(10):
    running_loss = 0

    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = model(inputs)

        loss = criterion(outputs, labels)
        loss.backward()

        optimizer.step()

        running_loss += loss.item()

    print('Epoch %d loss: %.3f' % (epoch+1, running_loss/len(trainloader)))

以上代码定义了一个SGD优化器,学习率为0.01,然后通过迭代训练数据集来调整模型参数。

总结

本文介绍了使用PyTorch进行深度学习模型开发的基础知识,包括张量及张量操作、自动微分以及神经网络模型开发。我们希望本文能够帮助初学者掌握PyTorch的基本使用方法,为深度学习实践奠定基础。