从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 创建神经网络。