返回

深度学习入门:一窥简单的神经网络

人工智能

在深度学习领域,神经网络是一种被广泛使用的机器学习模型,它可以从数据中学习并做出预测。神经网络由多个层组成,每一层包含多个神经元。这些神经元以一种特定的方式连接起来,允许信息在网络中流动并学习数据中的模式。

在这个教程中,我们将构建一个简单的神经网络来预测手写数字。我们将使用PyTorch,这是一个流行的深度学习框架,以其易用性和灵活性而著称。

1. 导入必要的库

首先,我们需要导入必要的库。

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms

2. 加载数据

我们将使用MNIST数据集来训练我们的神经网络。MNIST数据集包含70,000张手写数字图片,其中60,000张用于训练,10,000张用于测试。

train_data = datasets.MNIST(
    root='./data', 
    train=True, 
    download=True, 
    transform=transforms.ToTensor()
)

test_data = datasets.MNIST(
    root='./data', 
    train=False, 
    download=True, 
    transform=transforms.ToTensor()
)

3. 定义神经网络

接下来,我们将定义一个简单的神经网络。这个神经网络将由两层组成:一层输入层和一层输出层。输入层将包含784个神经元,因为MNIST图片的尺寸是28x28像素。输出层将包含10个神经元,因为MNIST数据集包含10个数字。

class NeuralNetwork(nn.Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

4. 定义损失函数和优化器

接下来,我们需要定义损失函数和优化器。损失函数将用于衡量神经网络的预测与真实标签之间的差异。优化器将用于更新神经网络的权重,以减少损失函数的值。

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

5. 定义EarlyStopping

为了防止过拟合,我们将使用EarlyStopping回调函数来监测验证集上的损失。当验证集上的损失连续10个epoch没有改善时,EarlyStopping回调函数将停止训练。

early_stopping = EarlyStopping(patience=10)

6. 训练神经网络

现在,我们可以开始训练神经网络了。

for epoch in range(1, num_epochs + 1):
    # 训练模型
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

    # 评估模型
    model.eval()
    with torch.no_grad():
        for batch_idx, (data, target) in enumerate(test_loader):
            output = model(data)
            loss = criterion(output, target)
            accuracy = (output.argmax(dim=1) == target).float().mean()

    # 日志记录
    print(f'Epoch: {epoch}/{num_epochs}, Loss: {loss.item()}, Accuracy: {accuracy.item()}')

    # EarlyStopping
    early_stopping(loss.item(), model)
    if early_stopping.early_stop:
        print("Early stopping")
        break

7. 评估神经网络

最后,我们可以评估神经网络在测试集上的表现。

model.eval()
with torch.no_grad():
    for batch_idx, (data, target) in enumerate(test_loader):
        output = model(data)
        loss = criterion(output, target)
        accuracy = (output.argmax(dim=1) == target).float().mean()

print(f'Test Loss: {loss.item()}, Accuracy: {accuracy.item()}')

希望这篇教程对您有所帮助。如果您有任何问题,请随时留言。