LeNET的学习以及代码实现

2023-11-01

根据李沐老师的动手深度学习的书进行学习

import torch
from torch import nn

net = nn.Sequential(
    nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
    nn.Linear(120, 84), nn.Sigmoid(),
    nn.Linear(84, 10))

输入的图像28×28 首先经过卷积层,使用6个5×5的卷积核进行卷积,会得到6个输出特征图,每个卷积核会生成一个特征图,特征图的大小通常用下面的公式所确定:

输出特征图大小 = (输入特征图大小 - 卷积核大小 + 2 × 填充大小)/ 步长 + 1

AvgPool2d池化操作 通过计算每个窗口内的元素的平均值,将均值作为输出特征图对应位置的值

具体的作用有:

1 特征降维 将输入的特征图的维度降低,从而减少计算量和参数数量。控制模型复杂度和减少过拟合有很大的帮助。

2 具有一定的平移不变性 输入的特征图中相同特征的位置发生平移时,输出特征图中对应的位置不会改变。

经过池化层处理 变成6个14×14的特征图,接下来继续卷积和池化。再通过全连接层得到输出。

X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape: \t',X.shape)

实现代码如下,用cpu训练模型

import time

import torch
import torch.nn as nn
from torch.nn import functional as F
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import torchvision.transforms as transforms

import torchvision
import matplotlib.pyplot as plt

class Animator:
    def __init__(self, xlabel='', xlim=None, legend=None):
        self.xlabel = xlabel
        self.xlim = xlim
        self.legend = legend
        self.fig, self.ax = plt.subplots()
        self.lines = []
        self.xdata, self.ydata = [], []
        self.init_plot()

    def init_plot(self):
        if self.xlim is not None:
            self.ax.set_xlim(*self.xlim)
        if self.legend is not None:
            self.ax.legend(self.legend)

    def add(self, x, y):
        self.xdata.append(x)
        self.ydata.append(y)
        self.update_plot()

    def update_plot(self):
        self.ax.clear()
        for line, label, y in zip(self.lines, self.legend, self.ydata):
            line.set_data(self.xdata, y)
            self.ax.plot(self.xdata, y, label=label)
        self.ax.set_xlabel(self.xlabel)
        self.ax.legend(self.legend)
        self.fig.canvas.draw()

    def show(self):
        plt.show()

net = nn.Sequential(
    nn.Conv2d(1, 6, kernel_size=5, padding=2),nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Conv2d(6, 16, kernel_size=5),nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(16 * 5 * 5, 120),nn.Sigmoid(),
    nn.Linear(120, 84),nn.Sigmoid(),
    nn.Linear(84, 10)
)

X = torch.rand(size=(1, 1, 28, 28),dtype=torch.float32)
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__, 'output shape: \t', X.shape)

batch_size = 256

# Define the data transforms for resizing and normalization
transform = transforms.Compose([
    transforms.Resize((28, 28)),
    transforms.ToTensor(),          # Convert images to tensors
    transforms.Normalize((0.5,), (0.5,))
])

# Load the Fashion MNIST dataset
mnist_train = torchvision.datasets.FashionMNIST(
    root='C:/Users/10854/pythonProject4', train=True, transform=transform, download=True
)
mnist_test = torchvision.datasets.FashionMNIST(
    root='C:/Users/10854/pythonProject4', train=False, transform=transform, download=True
)

# Create data loaders for training and testing
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False)
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
device = torch.device("cpu")
# Training loop
lr, num_epochs = 0.9, 10
def evaluate_accuracy(net, data_iter, device=None):
    if isinstance(net, nn.Module):
        net.eval()  # 设置为评估模式
        if not device:
            device = next(iter(net.parameters())).device

    # 正确预测的数量,总预测的数量
    correct_predictions = 0
    total_predictions = 0

    with torch.no_grad():
        for X, y in data_iter:
            X = X.to(device)
            y = y.to(device)
            y_hat = net(X)
            _, predicted = torch.max(y_hat, 1)
            correct_predictions += (predicted == y).sum().item()
            total_predictions += y.numel()

    accuracy = correct_predictions / total_predictions
    return accuracy

def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """用CPU训练模型"""
    def init_weights(m):
        if isinstance(m, nn.Linear) or isinstance(m, nn.Conv2d):
            nn.init.xavier_uniform_(m.weight)
    net.apply(init_weights)
    print('training on', device)
    net.to(device)
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    loss = nn.CrossEntropyLoss()
    animator = Animator(xlabel='epoch', xlim=[1, num_epochs],
                        legend=['train loss', 'train acc', 'test acc'])
    timer, num_batches = time.time(), len(train_iter)
    for epoch in range(num_epochs):
        # 训练损失之和,训练准确率之和,样本数
        metric = [0.0, 0.0, 0]
        net.train()
        for i, (X, y) in enumerate(train_iter):
            optimizer.zero_grad()
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            l.backward()
            optimizer.step()
            with torch.no_grad():
                metric[0] += l.item() * X.shape[0]
                correct = torch.eq(torch.argmax(y_hat, dim=1), y).float()
                metric[1] += torch.sum(correct).item()
                metric[2] += X.shape[0]
            train_l = metric[0] / metric[2]
            train_acc = metric[1] / metric[2]
            if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:
                animator.add(epoch + (i + 1) / num_batches,
                             (train_l, train_acc, None))
        test_acc = evaluate_accuracy(net, test_iter, device)
        animator.add(epoch + 1, (None, None, test_acc))
    print(f'loss {train_l:.3f}, train acc {train_acc:.3f}, '
          f'test acc {test_acc:.3f}')
    print(f'{metric[2] * num_epochs / (time.time() - timer):.1f} examples/sec '
          f'on {str(device)}')


train_ch6(net, train_iter, test_iter, num_epochs, lr, device)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeNET的学习以及代码实现 的相关文章

随机推荐

  • 用C++做高级病毒

    今天教大家做几个超级厉害的病毒 看完这篇文章之后你就能成为一名高级黑客了 声明 若电脑收到损伤 作者一律不负责 1 鼠标病毒 作用 让鼠标一直停在一个地方动不了 include
  • js Dom事件

    1 onclick 点击事件 2 ondbclick 双击事件 3 onmousedown 鼠标按下事件 4 onmouseup 鼠标松开事件 5 onmouseenter 鼠标移入事件 不支持冒泡 只触发一次 6 onmouseover
  • xml实体小实例

    如何定义和使用实体 一下是实体的一个小实例 gt
  • C++里仿函数是什么

    一 什么是仿函数 仿函数的意思是 它不是函数 其实是个类 但用法和函数一样 既然是个类 就可以存储很多变量和其他的信息 然后实现纯函数实现不了的功能 所以在一些需要函数作为参数的地方可以用仿函数代替 在STL里很多地方用到了仿函数 二 仿函
  • Java 密码复杂度校验

    1 需求 复杂性 用户的密码中必须包含的字符类型 默认为中 弱 必须包含小写字母 中 必须包含小写字母 数字 强 必须包含小写字母 数字 大写字母 特殊字符 鼠标移入的提示文字相同 注 检查密码复杂度 仅新增账户 重置密码时生效 已有账户密
  • 揭示OLED透明屏数据:探索未来显示技术的潜力

    OLED透明屏作为一项颇具吸引力的显示技术 以其独特的特点和卓越的画质在市场上引起了广泛关注 在这篇文章中 尼伽将和大家一起深入探索OLED透明屏的数据 通过具体的市场趋势分析 技术指标解析 应用领域探讨和未来前景展望 为读者提供全面了解和
  • wish虚拟服务器,云服务器操作wish

    云服务器操作wish 内容精选 换一换 按需计费 按需计费是后付费模式 按弹性云服务器的实际使用时长计费 可以随时开通 删除弹性云服务器 包年 包月 包年 包月是预付费模式 按订单的购买周期计费 适用于可预估资源使用周期的场景 价格比按需计
  • [开发

    ModelMapper是一个用于对象之间转换的Java库 它能够自动映射一个Java对象的属性到另一个Java对象 依赖安装
  • C/C++

    文章目录 空间的读写 作用 实现strlen 实现strcpy 非字符空间 void 返回值 返回连续空间类型 示例 函数内部实现 示例 参考 麦子学院 嵌入式C语言高级 C语言函数的使用 空间的读写 void fun char p con
  • VUE enement-ui之table表格隐藏滚动条

    只需修改样式即可 deep el table body wrapper webkit scrollbar width 0 注意 element ui表格很多样式修改都需要加深度穿透才能生效 效果图
  • 深度神经网络的matlab实现,深度神经网络代码matlab

    为什么不用matlab做深度学习 matlab可以做深度学习 但是从实用性的角度来讲matlab的实现效率相对较低 训练耗时较长 初次学习计算机语言就选择matlab不是一个明智的选择 最好选用C或者Basic作为入门语言 matlab是一
  • 初探C语言链表(一)

    初探链表 一 静态链表 二 动态链表 初始化链表 1 尾插法建立链表 2 头插法建立链表 三 动态链表的基本操作 1 遍历 2 查找 3 插入 4 清空 5 删除 6 销毁 四 链表的综合应用 什么是链表 链表是由一系列节点组成 每个节点包
  • 面试经验:阿里Java后台开发

    最近原来实习时候的Boss联系我 说他跳槽到了阿里 问我有没有兴趣面一个Java后台开发岗位 考虑到我只工作了一年 现在去阿里肯定要降薪 因此也没有太强烈的意愿 但出于提升自我的角度考虑 参加了面试 一面 电话面试一小时 首先做一个简单的自
  • 09虚幻4【UE4】中模型沿着轨道运动

    目录 一 创建Track蓝图类 轨道 并添加一个Spline样条曲线 二 创建TrackCar 移动车 蓝图类并添加一个Mesh 车 方块都可以 三 编写TrackCar的蓝图逻辑 3 1 设置自定义事件MoveCar 3 2 添加时间轴
  • Python全栈开发【基础-04】一文彻底理解Python变量

    专栏介绍 本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flas
  • Android手写占位式插件化框架之apk解析原理系统源码分析

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 上一篇文章 Android手写占位式插件化框架之Activity通信 Service通信和Broad
  • JAVA--不同包类的相互访问

    1 不同包之间的访问在定义类之前使用import 加导入的类名 2 不同包没有任何关系的两个类 只有public的类中的public成员才能被另一个包访问 package yi 第一个包 public class A public void
  • sqlserver数据库触发器,对当前的表数据插入时,根据条件防止数据重复插入。

    这是一个之前做项目用的 以下是触发器sql语句 直接执行即可 如果需求不一样需要修改对应的语句就行 USE NetCoreWebApi GO Object Trigger dbo testInsertTrigger Script Date
  • git clone 遇到问题:fatal: unable to access

    git clone 遇到问题 fatal unable to access https github com ros planning navigation git Failed to connect to 127 0 0 1 port 4
  • LeNET的学习以及代码实现

    根据李沐老师的动手深度学习的书进行学习 import torch from torch import nn net nn Sequential nn Conv2d 1 6 kernel size 5 padding 2 nn Sigmoid