LeNet(pytorch实现

LeNet

本文编写了一个简单易懂的LeNet网络,并在F-MNIST数据集上进行测试,允许使用GPU计算

python 复制代码
在这里插入代码片
import torch
from torch import nn, optim 
import d2lzh_pytorch as d2l

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# f-mnist 数据集是28*28的
class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(1, 6, 5),  # 输出通道,输出通道,核大小
            nn.Sigmoid(),
            nn.MaxPool2d(2, 2),  # 高宽减半
            nn.Conv2d(6, 16, 5),
            nn.Sigmoid(),
            nn.MaxPool2d(2, 2)
        )

        self.fc = nn.Sequential(
            d2l.FlattenLayer(),
            nn.Linear(16*4*4, 120),
            nn.Sigmoid(),
            nn.Linear(120, 84),
            nn.Sigmoid(),
            nn.Linear(84, 10)
        )

    def forward(self, img):
        feature = self.conv(img)
        output = self.fc(feature)
        return output
net = LeNet()

# 数据集
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

# 评估测试集,支持GPU
def evaluate_acc(data_iter, net, device = None):
    if device is None and isinstance(net, nn.Module):
        device = list(net.parameters())[0].device  # 看参数的gpu还是cpu
    acc_sum, n = 0.0, 0
    with torch.no_grad():
        for X,y in data_iter:
            if isinstance(net, nn.Module):  # 这个可加可不加
                net.eval()  # 评估模式
                acc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item()
                net.train()  # 转回训练模式
                n += y.shape[0]
                
    return acc_sum / n

def train(net, train_iter, test_iter, optimizer, device, epochs):
    net = net.to(device)
    loss = nn.CrossEntropyLoss()
    for epoch in range(epochs):
        train_l_sum, train_acc_sum, n = 0.0, 0.0, 0
        for X,y in train_iter:
            X = X.to(device)
            y = y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            optimizer.zero_grad()
            l.backward()
            optimizer.step()
            train_l_sum += l.cpu().item()
            train_acc_sum += (y_hat.argmax(dim=1) == y).sum().cpu().item()
            n += y.shape[0]
        test_acc = evaluate_acc(test_iter, net)
        print('epoch %d, loss %.4f, train_acc %.4f, test_acc %.4f'%(epoch + 1, train_l_sum, train_acc_sum/n, test_acc))

lr, epochs = 0.001, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
train(net, train_iter, test_iter, optimizer, device, epochs)
相关推荐
数据科学作家1 小时前
学数据分析必囤!数据分析必看!清华社9本书覆盖Stata/SPSS/Python全阶段学习路径
人工智能·python·机器学习·数据分析·统计·stata·spss
HXQ_晴天2 小时前
CASToR 生成的文件进行转换
python
CV缝合救星2 小时前
【Arxiv 2025 预发行论文】重磅突破!STAR-DSSA 模块横空出世:显著性+拓扑双重加持,小目标、大场景统统拿下!
人工智能·深度学习·计算机视觉·目标跟踪·即插即用模块
java1234_小锋3 小时前
Scikit-learn Python机器学习 - 特征预处理 - 标准化 (Standardization):StandardScaler
python·机器学习·scikit-learn
Python×CATIA工业智造3 小时前
Python带状态生成器完全指南:从基础到高并发系统设计
python·pycharm
向qian看_-_4 小时前
Linux 使用pip报错(error: externally-managed-environment )解决方案
linux·python·pip
Nicole-----4 小时前
Python - Union联合类型注解
开发语言·python
TDengine (老段)4 小时前
从 ETL 到 Agentic AI:工业数据管理变革与 TDengine IDMP 的治理之道
数据库·数据仓库·人工智能·物联网·时序数据库·etl·tdengine
蓝桉8025 小时前
如何进行神经网络的模型训练(视频代码中的知识点记录)
人工智能·深度学习·神经网络
星期天要睡觉5 小时前
深度学习——数据增强(Data Augmentation)
人工智能·深度学习