热门标签 | 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模型,我这里之所以选择自己构建一下,主要是出于学习的目的去更好的了解这个模型的一些细节,自我感觉这样更有趣一些。

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


推荐阅读
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
  • Python并行处理:提升数据处理速度的方法与实践
    本文探讨了如何利用Python进行数据处理的并行化,通过介绍Numba、多进程处理以及Pandas DataFrame上的并行操作等技术,旨在帮助开发者有效提高数据处理效率。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本文介绍了如何利用TensorFlow框架构建一个简单的非线性回归模型。通过生成200个随机数据点进行训练,模型能够学习并预测这些数据点的非线性关系。 ... [详细]
  • 支持向量机(SVM)是一种基于统计学习理论的模型,主要在VC维和结构风险最小化的理论基础上发展而来。本文将探讨几种不同的SVM方法及其优化策略,旨在提高模型的效率和适用性。 ... [详细]
  • 本文深入探讨了CART(分类与回归树)的基本原理及其在随机森林中的应用。重点介绍了CART的分裂准则、防止过拟合的方法、处理样本不平衡的策略以及其在回归问题中的应用。此外,还详细解释了随机森林的构建过程、样本均衡处理、OOB估计及特征重要性的计算。 ... [详细]
  • 智慧城市建设现状及未来趋势
    随着新基建政策的推进及‘十四五’规划的实施,我国正步入以5G、人工智能等先进技术引领的智慧经济新时代。规划强调加速数字化转型,促进数字政府建设,新基建政策亦倡导城市基础设施的全面数字化。本文探讨了智慧城市的发展背景、全球及国内进展、市场规模、架构设计,以及百度、阿里、腾讯、华为等领军企业在该领域的布局策略。 ... [详细]
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社区 版权所有