匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

从Python到深度学习:如何开始建立神经网络?

从Python到深度学习:如何开始建立神经网络?

深度学习一直是人工智能领域的热门话题。PyTorch 和 TensorFlow 是深度学习的最流行的工具之一,这两个框架都提供了丰富的神经网络构建函数。本文将通过一个简单的示例介绍如何使用 Python 和 PyTorch 构建神经网络。

首先,我们需要安装 PyTorch。它可以通过 pip 安装,只需运行以下命令:

```
pip install torch
```

接下来,我们需要导入 PyTorch 并定义我们的神经网络。这里我们将创建一个具有三个隐藏层和一个输出层的神经网络。每个隐藏层都有 64 个神经元,输出层有 10 个神经元。

```
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 64)
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, 64)
        self.fc4 = nn.Linear(64, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = nn.functional.relu(self.fc3(x))
        x = self.fc4(x)
        return nn.functional.log_softmax(x, dim=1)
```

在上面的代码中,我们首先定义了我们的神经网络模型类 `Net`。在类的初始化函数中,我们定义了四个全连接层,每层都使用线性变换。在前向传递函数中,我们先将输入数据 `x` 的形状从一个二维张量转换为一维张量,并通过 `nn.functional.relu` 函数应用 ReLU 激活函数。最后一层没有激活函数,并使用 `nn.functional.log_softmax` 函数进行归一化。

接下来,我们需要加载数据集。这里我们将使用 MNIST 数据集,其中包含 60,000 个训练图像和 10,000 个测试图像。每个图像都是 28x28 像素的灰度图像。以下代码将加载 MNIST 数据集并对其进行归一化:

```
import torch.optim as optim
from torchvision import datasets, transforms

transform = transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.1307,), (0.3081,))])

trainset = datasets.MNIST(root='./data', train=True,
                          download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                          shuffle=True, num_workers=2)

testset = datasets.MNIST(root='./data', train=False,
                         download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=1000,
                                         shuffle=False, num_workers=2)
```

在上面的代码中,我们使用 `transforms.Compose` 函数将两个转换操作 `transforms.ToTensor()` 和 `transforms.Normalize()` 组合在一起。这里,我们使用 `torchvision.datasets` 模块加载 MNIST 数据集,并创建 `DataLoader` 对象来批量处理训练和测试数据。

接下来,我们需要定义损失函数和优化器。这里我们使用交叉熵损失函数和 Adam 优化器。

```
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
```

在上面的代码中,我们创建了 `Net` 类的一个实例,并定义了我们的损失函数和优化器。我们使用 Adam 优化器,并指定了学习率为 0.001。

现在我们可以开始训练我们的神经网络了。以下是一个简单的训练循环:

```
for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0
```

在上面的代码中,我们迭代了 10 次数据集,并在每次迭代中计算训练损失并更新模型参数。我们将每个批次的损失累加到 `running_loss` 变量中。我们还每 100 个批次打印一次平均损失。

最后,我们可以使用测试数据集评估我们的模型。以下是评估代码:

```
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))
```

在上面的代码中,我们首先使用 `torch.no_grad()` 上下文管理器禁用梯度计算。然后迭代测试数据集,计算模型的输出并使用 `torch.max` 函数找到分类概率最高的类别。最后,我们计算模型在测试数据集上的准确率。

在这篇文章中,我们使用 PyTorch 创建了一个简单的神经网络,并使用 MNIST 数据集对其进行了训练和评估。当然,这只是深度学习中的一小部分,但它展示了如何使用 Python 和 PyTorch 创建神经网络。