用PyTorch構建第一個神經網絡模型

本文介绍了如何使用PyTorch来构建一个基于MNIST数据集的简单神经网络模型,包括定义模型结构、设置超参数、训练和测试过程,展示了PyTorch在深度学习中的应用。
摘要由CSDN通过智能技术生成

PyTorch是一種開源的Python機器學習框架,其簡潔的API和優秀的自動微分功能使其成為構建神經網絡模型的首選框架之一。在本文中,我們將使用PyTorch來構建一個簡單的神經網絡模型,並使用MNIST數字數據集進行訓練和測試。

首先,讓我們安裝PyTorch並導入必要的庫。以下是代碼:

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

接下來,我們將定義一些超參數,例如學習率、訓練次數和批次大小。以下是代碼:

learning_rate = 0.01
epochs = 10
batch_size = 64

現在,讓我們定義一個神經網絡模型。在這個例子中,我們將構建一個具有兩個隱藏層的多層感知器。以下是代碼:

 
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10)
        self.relu = nn.ReLU()
        
    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.fc3(x)
        return x

在這個模型中,我們使用了三個全連接層,兩個ReLU激活函數以及一個10類別的輸出層。模型的輸入大小為784(28 x 28),因為我們使用的是MNIST數字數據集。模型的輸出大小為10,每個數字都有一個對應的輸出。

接下來,我們需要定義訓練和測試函數。以下是代碼:

def train(model, device, train_loader, optimizer, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        data = data.view(data.size(0), -1)
        optimizer.zero_grad()
        output = model(data)
        loss = nn.functional.cross_entropy(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()))

在訓練函數中,我們使用了交叉熵損失函數和反向傳播算法來計算損失和更新參數。同時,我們使用了GPU來加速訓練過程。我們還在每個訓練批次的結束時輸出了一些訓練信息。

現在,讓我們定義測試函數。以下是代碼:

def test(model, device, test_loader):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            data = data.view(data.size(0), -1)
            output = model(data)
            test_loss += nn.functional.cross_entropy(output, target, reduction='sum').item()
            pred = output.argmax(dim=1, keepdim=True)
            correct += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_loader.dataset)

    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

在測試函數中,我們計算了模型的損失和準確度。在這個例子中,我們使用了MNIST數字數據集的測試集來計算這些指標。同樣,我們使用了GPU來加速測試過程。

最後,我們需要定義一些數據加載器和優化器。以下是代碼:

train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=batch_size, shuffle=True)

test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=False, transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=batch_size, shuffle=True)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = Net().to(device)
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

在這裡,我們定義了兩個數據加載器(一個用於訓練,一個用於測試)和一個優化器(使用隨機梯度下降算法)。

現在,讓我們開始訓練模型。以下是代碼:

for epoch in range(1, epochs + 1):
    train(model, device, train_loader, optimizer, epoch)
    test(model, device, test_loader)

在這裡,我們遍歷

了10個訓練周期,並在每個周期中使用訓練函數訓練模型,然後使用測試函數測試模型。這個過程可能需要一段時間,具體取決於你的電腦性能和數據集的大小。

當訓練完成後,你應該可以看到類似以下的輸出:

Train Epoch: 1 [0/60000 (0%)]	Loss: 2.325562
Train Epoch: 1 [6400/60000 (11%)]	Loss: 0.566974
Train Epoch: 1 [12800/60000 (21%)]	Loss: 0.321594
...
Test set: Average loss: 0.1288, Accuracy: 9623/10000 (96%)

Train Epoch: 2 [0/60000 (0%)]	Loss: 0.292226
Train Epoch: 2 [6400/60000 (11%)]	Loss: 0.224239
Train Epoch: 2 [12800/60000 (21%)]	Loss: 0.232594
...
Test set: Average loss: 0.0947, Accuracy: 9712/10000 (97%)

這裡,我們可以看到每個訓練周期的訓練損失和測試準確度。我們可以看到,隨著訓練進行,訓練損失逐漸減少,測試準確度逐漸提高。最終,我們的模型在測試集上達到了96%以上的準確率。

這就是使用PyTorch構建第一個神經網絡模型的過程。通過這個例子,我們學會了如何使用PyTorch來定義神經網絡模型、訓練模型和測試模型。我們還學會了如何使用GPU來加速模型的訓練和測試過程。這些技能將有助於你更好地理解深度學習和機器學習的基本概念,並讓你更加熟練地使用PyTorch來進行深度學習研究和開發。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

�SamSam

缺錢的程序員希望得到大家的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值