PyTorch 创建和训练一个基本的神经网络MNIST 数据集(手写数字识别)

当然可以!这里是一个简单的 PyTorch 机器学习示例,展示了如何使用 PyTorch 创建和训练一个基本的神经网络。我们将使用一个经典的 MNIST 数据集(手写数字识别)来进行演示。

 1. 安装 PyTorch

首先,请确保你已安装了 PyTorch。如果没有安装,可以使用以下命令进行安装:

bash
pip install torch torchvision


 2. 导入库

python
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim


 3. 数据预处理

我们将使用 torchvision 加载 MNIST 数据集,并进行标准化处理:

python
 数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

 下载数据集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True)

testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False)


 4. 定义神经网络

我们将定义一个简单的前馈神经网络:

python
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(2828, 500)   输入层到隐藏层
        self.fc2 = nn.Linear(500, 10)      隐藏层到输出层
    
    def forward(self, x):
        x = x.view(-1, 2828)   将图像展平
        x = torch.relu(self.fc1(x))   激活函数
        x = self.fc2(x)
        return x

net = Net()


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

python
criterion = nn.CrossEntropyLoss()   损失函数
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)   优化器


 6. 训练网络

python
for epoch in range(2):   多轮训练
    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 % 1000 == 999:   每1000个小批量输出一次损失
            print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 1000}')
            running_loss = 0.0

print('Finished Training')


 7. 测试网络

python
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(f'Accuracy of the network on the 10000 test images: {100  correct // total}%')


 8. 保存和加载模型

python
 保存模型
torch.save(net.state_dict(), 'model.pth')

 加载模型
net = Net()
net.load_state_dict(torch.load('model.pth'))


这是一个基础的 PyTorch 机器学习示例。你可以根据需要调整网络结构、超参数等,以适应不同的任务。
要调用上述模型并进行预测,你可以按照以下步骤操作:

 1. 导入所需库和加载模型

确保你已导入必要的库,并加载模型的参数。

python
import torch
import torchvision.transforms as transforms
from PIL import Image

 定义模型结构
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(28*28, 500)   输入层到隐藏层
        self.fc2 = nn.Linear(500, 10)      隐藏层到输出层
    
    def forward(self, x):
        x = x.view(-1, 28*28)   将图像展平
        x = torch.relu(self.fc1(x))   激活函数
        x = self.fc2(x)
        return x

 实例化模型并加载训练好的参数
net = Net()
net.load_state_dict(torch.load('model.pth'))
net.eval()   设置模型为评估模式


 2. 预处理输入图像

确保输入图像的尺寸和格式与训练时的图像一致。

python
def preprocess_image(image_path):
    transform = transforms.Compose([
        transforms.Grayscale(),   MNIST 数据集是灰度图像
        transforms.Resize((28, 28)),   调整图像尺寸
        transforms.ToTensor(),
        transforms.Normalize((0.5,), (0.5,))   与训练时的标准化相同
    ])
    image = Image.open(image_path)
    image = transform(image)
    return image.unsqueeze(0)   增加批次维度


 3. 进行预测

加载图像并进行预测。

python
def predict(image_path):
    image = preprocess_image(image_path)
    with torch.no_grad():   不需要计算梯度
        output = net(image)
        _, predicted = torch.max(output.data, 1)
        return predicted.item()   返回预测的标签


 4. 使用模型进行预测

你可以通过调用 predict 函数来对图像进行分类。

python
image_path = 'path_to_your_image.png'   替换为你自己的图像路径
predicted_label = predict(image_path)
print(f'The predicted label is: {predicted_label}')


确保你替换 'path_to_your_image.png' 为实际图像的路径。此代码将输出模型对图像的预测标签。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值