首页 > 其他分享 >6.6 卷积神经网络LeNet

6.6 卷积神经网络LeNet

时间:2023-08-01 10:26:00浏览次数:42  
标签:nn 卷积 metric iter 6.6 train LeNet device net

LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。 这个模型是由AT&T贝尔实验室的研究员Yann LeCun在1989年提出的(并以其命名),目的是识别图像中的手写数字。

总体来看,LeNet由两个部分组成:

  • 卷积编码器:由两个卷积层组成;

  • 全连接层密集块:由三个全连接层组成。

 使用pytorch框架实现此类模型非常简单,只需要用Sequential实例化一个块就行了。

import torch
from torch import nn
from d2l import torch as d2l

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))

LeNet各层的形状如下图所示:

 我们使用下面的代码逐一打印各层的输出的形状,以确保是否和我们预期的一致:

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)

输出:

 

下面在fashion_mnist数据集上面训练和评估LeNet,将计算放在GPU上。

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)

def evaluate_accuracy_gpu(net, data_iter, device=None): #@save
    """使用GPU计算模型在数据集上的精度"""
    if isinstance(net, nn.Module):
        net.eval()  # 设置为评估模式
        if not device:
            device = next(iter(net.parameters())).device
# 正确预测的数量,总预测的数量
    metric = d2l.Accumulator(2)
    with torch.no_grad():
        for X, y in data_iter:
            if isinstance(X, list):
                # BERT微调所需的(之后将介绍)
                X = [x.to(device) for x in X]
            else:
                X = X.to(device)
            y = y.to(device)
            metric.add(d2l.accuracy(net(X), y), y.numel())
    return metric[0] / metric[1]

#@save
def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """用GPU训练模型(在第六章定义)"""
    def init_weights(m):
        if type(m) == nn.Linear or type(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 = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],
                            legend=['train loss', 'train acc', 'test acc'])
    timer, num_batches = d2l.Timer(), len(train_iter)
    for epoch in range(num_epochs):
        # 训练损失之和,训练准确率之和,样本数
        metric = d2l.Accumulator(3)
        net.train()
        for i, (X, y) in enumerate(train_iter):
            timer.start()
            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.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])
            timer.stop()
            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_gpu(net, test_iter)
        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 / timer.sum():.1f} examples/sec '
          f'on {str(device)}')

lr, num_epochs = 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

这代码与之前的区别基本上就在于,将每一个小批量数据移动到了我们指定的设备(如GPU)上。

训练结果:

 

标签:nn,卷积,metric,iter,6.6,train,LeNet,device,net
From: https://www.cnblogs.com/pkuqcy/p/17595672.html

相关文章

  • Linux 6.6+ Oracle RAC 12c搭建详解
    1. RedHatEnterpriseLinuxServerrelease6.6x86_64两台2. Oracle12.1.0.13. ASM存储方式4. 软件下载:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle12c-linux-12201-3608234.html 5. 基础安装包yum-yinstallbinutils.x86......
  • opencv-python 卷积操作
    1图像卷积图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程,卷积可以用来提取特征,去噪,平滑等。如下图: ......
  • Nexpose v6.6.208 for Linux & Windows - 漏洞扫描
    Nexposev6.6.208forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseJul27,2023请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随......
  • 算法学习笔记(24): 狄利克雷卷积和莫比乌斯反演
    狄利克雷卷积和莫比乌斯反演看了《组合数学》,再听了学长讲的……感觉三官被颠覆……目录狄利克雷卷积和莫比乌斯反演狄利克雷卷积特殊的函数函数之间的关系除数函数和幂函数欧拉函数和恒等函数莫比乌斯函数和欧拉函数卷积的逆元莫比乌斯函数与莫比乌斯反演求法数论分块(整除分......
  • 6.2 图像卷积
    我们定义一个函数,实现图像的卷积操作。 这里X[i:i+h,j:j+w]的用法是把X这个大矩阵中,行数从i到i+h-1,列数从j到j+w-1的一小块给拿出来了,例子如下:A=torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]])print(A[0:3,1:4])输出结果: 1.卷积层......
  • 苹果iOS 16.6 RC发布:或为iPhone X/8系列养老版本
    今天苹果向iPhone用户推送了iOS16.6RC更新(内部版本号:20G75),这是时隔两个月的首次更新。按照惯例RC版基本不会有什么问题,会在最近一段时间内直接变成正式版,向所有用户推送。需要注意的是,鉴于iOS17正式版即将到来,后续iOS16大概率不会带来任何新功能的更新,只是简单的小修小补和......
  • 【第2周】卷积神经网络
    一、代码练习importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsimportmatplotlib.pyplotaspltimportnumpy#一个函数,用来计算模型中有多少参数defget_n_params(model):......
  • 卷积神经网络不同优化器
    实现卷积神经网络不同优化器简介卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种广泛应用于图像处理和计算机视觉任务中的深度学习模型。在训练过程中,我们通常会使用优化器(Optimizer)来自动调整网络的权重和偏置,以最小化损失函数。本文将介绍如何使用不同的优化器来训练卷积......
  • 卷积神经网络
    ConvolutionalNeuralNetwork(CNN卷积神经网络)解释一应用于Imageclassification(图像分类)一张图片如何作为一个模型的输入:一张图片可以当成三维的Tensor(维度大于等于2的矩阵),三维分别代表图片:宽、高、channels(宽高代表像素,channels代表RGB三色) 参数过多,模型弹......
  • c语言卷积的编程
    1、用c语言做这个离散卷积2、ccs5编写c语言卷积算法一般多少个周期?3、快速卷积在什么情况下效率最高呢4、C语言怎么实现小波变换5、C语言用子函数实现卷积6、怎样用c语言编写卷积计算程序用c语言做这个离散卷积暴力N^2可以直接乘,直接双重循环即可,要快的话可以用NlogN......