【学习笔记】深度学习实战 | PyTorch 入门(MLP为例)

在这里插入图片描述

简要声明


  1. 学习相关网址
    1. [双语字幕]吴恩达深度学习deeplearning.ai
    2. Papers With Code
    3. Datasets
  2. 深度学习网络基于PyTorch学习架构,代码测试可跑。
  3. 本学习笔记单纯是为了能对学到的内容有更深入的理解,如果有错误的地方,恳请包容和指正。

参考文献


  1. PyTorch Tutorials [https://pytorch.org/tutorials/]
  2. PyTorch Docs [https://pytorch.org/docs/stable/index.html]

简要介绍


MLP (Multilayer Perceptron)

在这里插入图片描述

DatasetMNIST
Input (feature maps)32×32 (28×28)
CONV Layers0
FC Layers3
ActivationReLU
Output10

代码分析


函数库调用

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor

处理数据

数据下载

# 从开放数据集中下载训练数据
train_data = datasets.MNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)

# 从开放数据集中下载测试数据
test_data = datasets.MNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)

print(f'Number of training examples: {len(train_data)}')
print(f'Number of testing examples: {len(test_data)}')

Number of training examples: 60000
Number of testing examples: 10000

数据加载器(可选)

batch_size = 64

# 创建数据加载器
train_dataloader = DataLoader(train_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)

for X, y in test_dataloader:
    print(f"Shape of X [N, C, H, W]: {X.shape}")
    print(f"Shape of y: {y.shape} {y.dtype}")
    break

Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28])
Shape of y: torch.Size([64]) torch.int64

创建模型

# 选择训练设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Using {device} device")

Using cuda device

class MLP(nn.Module):
    def __init__(self, input_dim, output_dim):
        super().__init__()

        self.input_layer = nn.Sequential(
            nn.Linear(input_dim, 250),
            nn.ReLU()
        )

        self.hidden_layer = nn.Sequential(
            nn.Linear(250, 100),
            nn.ReLU()
        )

        self.output_layer = nn.Sequential(
            nn.Linear(100, output_dim)
        )

    def forward(self, x):
        x = x.view(x.size(0), -1)
        x = self.input_layer(x)
        x = self.hidden_layer(x)
        x = self.output_layer(x)
        return x

model = MLP(28*28, 10).to(device)
print(model)

MLP(
(input_layer): Sequential(
(0): Linear(in_features=784, out_features=250, bias=True)
(1): ReLU()
)
(hidden_layer): Sequential(
(0): Linear(in_features=250, out_features=100, bias=True)
(1): ReLU()
)
(output_layer): Sequential(
(0): Linear(in_features=100, out_features=10, bias=True)
)
)

训练模型

选择损失函数和优化器

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

训练循环

def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    model.train()
    for batch, (X, y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)

        # Compute prediction error
        pred = model(X)
        loss = loss_fn(pred, y)

        # Backpropagation
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

        if batch % 100 == 0:
            loss, current = loss.item(), (batch + 1) * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")

测试循环

def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    model.eval()
    test_loss, correct = 0, 0
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            pred = model(X)
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
    test_loss /= num_batches
    correct /= size
    print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

训练模型

epochs = 5
for t in range(epochs):
    print(f"Epoch {t+1}\n-------------------------------")
    train(train_dataloader, model, loss_fn, optimizer)
    test(test_dataloader, model, loss_fn)
print("Done!")

Epoch 1

loss: 2.304649 [ 64/60000]
loss: 0.350683 [ 6464/60000]
loss: 0.267444 [12864/60000]
loss: 0.305221 [19264/60000]
loss: 0.200744 [25664/60000]
loss: 0.316856 [32064/60000]
loss: 0.156469 [38464/60000]
loss: 0.280946 [44864/60000]
loss: 0.291244 [51264/60000]
loss: 0.199387 [57664/60000]
Test Error:
Accuracy: 94.7%, Avg loss: 0.169173

模型处理

保存模型

torch.save(model.state_dict(), "model.pth")
print("Saved PyTorch Model State to model.pth")

Saved PyTorch Model State to model.pth

加载模型

model = MLP(28*28, 10).to(device)
model.load_state_dict(torch.load("model.pth"))

重要函数


torch.cuda.is_available()返回一个布尔值,指示 CUDA 当前是否可用
nn.Sequential用于存储 Module 的列表
nn.Linear线性变换
nn.ReLU修正线性单位函数
nn.CrossEntropyLoss交叉熵损失
torch.optim.AdamAdam 算法
torch.save保存模型
torch.load加载模型
  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyTorch是一个开源的机器学习框架,支持各种深度学习模型的搭建和训练。MLP(Multi-Layer Perceptron)是一种最基本的前馈神经网络模型,也被称为全连接神经网络。在PyTorch中,可以使用torch.nn模块来构建MLP模型。 下面是一个简单的MLP模型的示例代码: ```python import torch import torch.nn as nn # 定义MLP模型 class MLP(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(MLP, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 设置输入维度、隐藏层大小和输出类别数 input_size = 784 # MNIST图像大小为28x28=784 hidden_size = 256 num_classes = 10 # MNIST数据集有10个类别(0-9) # 创建MLP模型实例 model = MLP(input_size, hidden_size, num_classes) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 进行模型训练 for epoch in range(num_epochs): # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() ``` 这段代码展示了如何使用PyTorch构建一个简单的MLP模型,并使用交叉熵损失函数和随机梯度下降(SGD)优化器进行训练。你可以根据自己的需求修改模型的输入维度、隐藏层大小和输出类别数,并选择不同的优化器和损失函数来适应不同的任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Benjamin Chen.

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值