热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

经典CNN模型之AlexNet(Paddle)

虽然我是一个深度学习方面的小白,但是对于卷积神经网络我仍然有很强的好奇心,所以特地学习了一下,如果出现了错误还望大家及时指正*~*。文章目

虽然我是一个深度学习方面的小白,但是对于卷积神经网络我仍然有很强的好奇心,所以特地学习了一下,如果出现了错误还望大家及时指正*~*。

文章目录

    • 一、简介
    • 二、网络结构
    • 三、代码实现(Paddle)
    • 四、小结


一、简介


在LeNet提出后的几十年里,神经网络一度被其他机器学习的方法超越,而导致出现这种情况的原因主要有:(1)数据,一个包含许多特征的深度模型它需要大量的有标签的数据才能表现得比其他经典方法更好;(2)硬件(算力),深度学习对计算资源要求很高,但是早期的硬件计算能力非常有限。直到2012年,这两点都得到了很大程度的改善,这也就造就了AlexNet模型的横空出世。它首次证明了学习到的特征可以超越手工设计的特征,一举打破了困扰计算机视觉研究的瓶颈。


二、网络结构


AlexNet与LeNet的设计理念非常相似,但也有非常明显的区别。第一、AlexNet包含5层卷积、2层全连接隐藏层以及1层全连接输出层;第二、AlexNet模型将sigmoid激活函数更改为了更为简单的ReLU激活函数;第三、AlexNet通过丢弃法(Dropout)有效的控制了全连接层的模型复杂度,防止引入过多的参数;第四、AlexNet引入了大量的图像增广,如翻转、裁剪以及颜色变化等,有效的增加了数据样本的数量,从而缓解了过拟合现象的发生。
由于ImageNet数据集中的图像要比MINST数据集大许多,所以需要更大的卷积核来捕捉物体,因此第一层卷积核的窗口为11×11。而第二层卷积核就减少到5×5,之后就一直采用3×3。此外,第一、第二和第五个卷积层之后都使用了窗口形状为3×3、步幅为2的最大池化层,最后就是一般的全连接层。借用书中的图来表示一下(主要是我自己作图太难看*^*):

在这里插入图片描述

但是呢,你只要细心一点就会发现,第一层卷积层的224×224是有问题的,应该是227×227才对,这一点在吴恩达老师的视频中也被提到,所以正确的图应该是下面这个。

在这里插入图片描述

三、代码实现(Paddle)


虽然知道上面的224×224是有点问题的,但是我还只能用它来完成我的AlexNet实验,这是因为当我使用227×227时,出现了下面的错误:

在这里插入图片描述

总的来说就是电脑配置有点差,没法完成这个实验*^*,所以就将就一下使用224×224来进行测试了,框架使用的是百度的paddle飞桨,代码如下所示。

import paddle
import paddle.nn.functional as F#组网
class AlexNet(paddle.nn.Layer):def __init__(self) -> None:super(AlexNet,self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels = 1, out_channels = 96, kernel_size = 11, stride = 4)self.conv2 = paddle.nn.Conv2D(in_channels = 96, out_channels = 256, kernel_size = 5, stride = 1, padding = 2)self.conv3 = paddle.nn.Conv2D(in_channels = 256, out_channels = 384, kernel_size = 3, stride = 1, padding = 1)self.conv4 = paddle.nn.Conv2D(in_channels = 384, out_channels = 384, kernel_size = 3, stride = 1, padding = 1)self.conv5 = paddle.nn.Conv2D(in_channels = 384, out_channels = 256, kernel_size = 3, stride = 1, padding = 1)self.pool1 = paddle.nn.MaxPool2D(3,2)self.pool2 = paddle.nn.MaxPool2D(3,2)self.pool3 = paddle.nn.MaxPool2D(3,2)self.linear1 = paddle.nn.Linear(in_features = 256*5*5, out_features = 4096)self.linear2 = paddle.nn.Linear(in_features = 4096, out_features = 4096)self.linear3 = paddle.nn.Linear(in_features = 4096, out_features = 10)def forward(self,x):x = self.conv1(x)x = F.relu(x)x = self.pool1(x)x = self.conv2(x)x = F.relu(x)x = self.pool2(x)x = self.conv3(x)x = F.relu(x)x = self.conv4(x)x = F.relu(x)x = self.conv5(x)x = F.relu(x)x = self.pool3(x)x = paddle.flatten(x,start_axis=1,stop_axis=-1)x = self.linear1(x)x = F.relu(x)x = F.dropout(x,0.5)x = self.linear2(x)x = F.relu(x)x = F.dropout(x,0.5)x = self.linear3(x)return x#读取数据
def load_data_fashion_mnist(batch_size, resize=None):"""Download the fashion mnist dataset and then load into memory."""trans = []if resize:trans.append(paddle.vision.transforms.Resize(size=resize)) #将输入数据调整为指定大小trans.append(paddle.vision.transforms.ToTensor())transform = paddle.vision.transforms.Compose(trans)mnist_train = paddle.vision.datasets.FashionMNIST(mode='train', transform=transform) #由于ImageNet太大所以使用了FashionMNIST数据集mnist_test = paddle.vision.datasets.FashionMNIST(mode='test', transform=transform)train_iter = paddle.io.DataLoader(mnist_train,batch_size=batch_size, shuffle=True,places=paddle.CPUPlace())test_iter = paddle.io.DataLoader(mnist_test,batch_size=batch_size, shuffle=False, places=paddle.CPUPlace()) #places=paddle.CPUPlace()缺少这个关键字会莫名其妙的停止程序,飞桨官网的解释是当前还不支持在子进程中进行GPU Tensor的操作,请不要在子进程流程中使用GPU Tensorreturn train_iter , test_iterbatch_size = 128
# 如出现“out of memory”的报错信息,可减⼩batch_size或resize
train_iter, test_iter = load_data_fashion_mnist(batch_size,resize=224)# 加载训练集 batch_size 设为 128
def train(model):model.train()epochs = 5optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())# 用Adam作为优化函数for epoch in range(epochs):for batch_id, data in enumerate(train_iter()):x_data = data[0]y_data = data[1]predicts = model(x_data)loss = F.cross_entropy(predicts, y_data) #交叉熵损失函数# 计算损失acc = paddle.metric.accuracy(predicts, y_data) #计算数据的准确度loss.backward()if batch_id % 100 == 0:print("epoch: {}, batch_id: {}, loss is: {}, acc is: {}".format(epoch, batch_id, loss.numpy(), acc.numpy()))optim.step()optim.clear_grad()
model = AlexNet()
train(model)

运行的效果:
在这里插入图片描述

四、小结

当然,每个深度学习的框架里可能都有现成的AlexNet模型,我这里之所以选择自己构建一下,主要是出于学习的目的去更好的了解这个模型的一些细节,自我感觉这样更有趣一些。

参考资料:《动手学深度学习》《吴恩达老师视频》


推荐阅读
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 【高效构建全面的iOS直播应用】(美颜功能深度解析)
    本文深入探讨了如何高效构建全面的iOS直播应用,特别聚焦于美颜功能的技术实现。通过详细解析美颜算法和优化策略,帮助开发者快速掌握关键技术和实现方法,提升用户体验。适合对直播应用开发感兴趣的开发者阅读。 ... [详细]
  • TensorFlow基础知识深化讲解
    批标准化批标准化(batchnormalization,BN)是为了克服神经网络层数加深导致难以训练而诞生的。深度神经网络随着深度加深,收 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析
    池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • Go语言中Goroutine与通道机制及其异常处理深入解析
    在Go语言中,Goroutine可视为一种轻量级的并发执行单元,其资源消耗远低于传统线程,初始栈大小仅为2KB,而普通线程则通常需要几MB。此外,Goroutine的调度由Go运行时自动管理,能够高效地支持成千上万个并发任务。本文深入探讨了Goroutine的工作原理及其与通道(channel)的配合使用,特别是在异常处理方面的最佳实践,为开发者提供了一套完整的解决方案,以确保程序的稳定性和可靠性。 ... [详细]
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • Windows下用cpu模式跑通目标检测py-faster-rcnn 的demo.py
    关键字:Windows、cpu模式、Python、faster-rcnn、demo.py声明:原文发表在博客园,未经允许不得转载!!!本篇blog过程已经多名读者实践验证,有人反馈报错TypeEr ... [详细]
  • 现在要针对我们需求引入检测模型,只检测人物,然后是图像能侧立,这样人物在里面占比更多,也更清晰,也不需要检测人占比小的情况,如下是针对这个需求,用的yolov3-tiny模型训练后 ... [详细]
author-avatar
晕晕的劳拉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有