目录

  • 1 什么是神经网络?
  • 2 卷积神经网络
  • 3 实验流程
    • 3.1 搭建神经网络
    • 3.2 加载数据集
    • 3.3 训练模型
  • 4 算法分析

1 什么是神经网络?

我们知道人工智能发展过程中有三个主要流派:

  • 符号主义学派
  • 连接主义学派
  • 行为主义学派

其中连接主义学派认为:人脑中万亿个神经元细胞间错综复杂的互相连接,是智能产生的来源。连接主义的核心是仿生学和神经科学,关注的是神经网络间的连接机制和学习算法,致力于通过计算机表示大量神经元,以模拟大脑的智力。这就是神经网络的起源,其正式定义如下:

人工神经网络(Artificial Neural Networks,ANNs)也简称为神经网络或称作连接模型,它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

如下图所示是一个用于图形图像处理的卷积神经网络框架,今天就从零开始训练处下面这种网络。

2 卷积神经网络

卷积神经网络(Convolutional Neural Network, CNN)在全连接神经网络的基础上增加了特征提取层,主要用于计算机视觉领域,处理模式识别、图像分类、目标检测等问题。

CNN相比FCNN更适于处理视觉任务的原因在于,其实现了高维信息的聚合与压缩

举例而言,以一张二维图片的像素为输入,则FCNN的输入层神经元个数将非常庞大,再考虑每个神经元都相邻层所有神经元相连,因此作为优化目标的连接权矩阵指数增长,带来无法接受的学习时间复杂度。而CNN通过对图片信息的特征筛选,滤除图片掺杂的大量冗余信息,再通过简单的全连接网络映射到输出空间去,将大幅降低复杂度。

3 实验流程

本问针对经典的MNIST手写数字分类实验,基于Pytorch框架自主设计神经网络,测试网络性能,并进行一定的可视化分析。实验的流程如下:

  1. 搭建卷积神经网络;
  2. 加载数据集。下载MNIST手写数字数据集,划分训练集、验证集和测试集,并封装为可迭代的数据加载器对象;
  3. 训练模型。定义损失函数和优化方法,通过前向传播计算损失,再基于反向传播优化模型参数,迭代至训练误差收敛后保存模型到本地;

3.1 搭建神经网络

如下所示,搭建卷积神经网络。其中

  • Conv2d:卷积层
  • MaxPool2d:池化层
  • ReLu:激活函数

这些神经网络组件的具体原理与作用另开文章分析,本章关注于应用实践。

class CNN(nn.Module):'''* @breif: 卷积神经网络'''    def __init__(self):super().__init__()self.convPoolLayer_1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=10, kernel_size=5),nn.MaxPool2d(kernel_size=2),nn.ReLU())self.convPoolLayer_2 = nn.Sequential(nn.Conv2d(in_channels=10, out_channels=20, kernel_size=5),nn.MaxPool2d(kernel_size=2),nn.ReLU())self.fcLayer = nn.Linear(320, 10)def forward(self, x):batchSize = x.size(0)x = self.convPoolLayer_1(x)x = self.convPoolLayer_2(x)x = x.reshape(batchSize, -1)x = self.fcLayer(x)return x

3.2 加载数据集

使用pytorch提供的Dataset类进行数据集加载和预览

from abc import abstractmethod
import numpy as np
from torchvision.datasets import mnist
from torch.utils.data import Dataset
from PIL import Imageclass mnistData(Dataset):'''* @breif: MNIST数据集抽象接口* @param[in]: dataPath -> 数据集存放路径* @param[in]: transforms -> 数据集变换'''    def __init__(self, dataPath: str, transforms=None) -> None:super().__init__()self.dataPath = dataPathself.transforms = transformsself.data, self.label = [], []def __len__(self) -> int:return len(self.label)def __getitem__(self, idx: int):img = self.data[idx]if self.transforms:img = self.transforms(img)return img, self.label[idx]def loadData(self, train: bool) -> list:'''* @breif: 下载与加载数据集* @param[in]: train -> 是否为训练集* @retval: 数据与标签列表'''    # 如果指定目录下不存在数据集则下载dataSet   = mnist.MNIST(self.dataPath, train=train, download=True)# 初始化数据与标签data  = [ i[0] for i in dataSet ]label = [ i[1] for i in dataSet ]return data, label

3.3 训练模型

考虑到该实践是多分类问题,因此最终网络的输出是十维向量并经过softmax转化为概率分布,损失函数设计为交叉熵,优化方法选择随机梯度下降算法。

for images, labels in trainBar:images, labels = images.to(config.device), labels.to(config.device)# 梯度清零opt.zero_grad()# 正向传播outputs = model(images)# 计算损失loss = F.cross_entropy(outputs, labels)# 反向传播loss.backward()# 模型更新opt.step()

训练过程如下:

4 算法分析

经过测试,同样的学习率下,CNN在20代左右就已收敛,但FCNN在20代左右才开始收敛。测试集泛化误差表明CNN的预测准确率达到95%,但FCNN只有70%,因此在图像分类问题上,CNN的效率和准确率都远远高于FCNN。因此CNN的学习和泛化能力较强,只要用已知模式对CNN加以训练,网络就具有对输入输出之间的映射和表达能力。

完整源码请联系下方博主名片获取


神经网络听上去高大上?带你从零开始训练一个网络(基于MNIST)相关推荐

  1. 【微前端】手把手带你从零开始搭建一个qiankun+vue微前端应用

    前言 小伙伴们大家好.上一篇文章中我们分享了qiankun的一些概念和特性,以及基于qiankun实现有一个微前端应用的大概步骤,最后以qiankun加vue2.0为例给出了快速搭建qiankun微前 ...

  2. [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  3. 带你从零开始设计一个简单CPU

    文章目录 前言 一 CPU的基本组成 二 CPU的基石 三 ALU(运算器) 1.二进制 (1)二进制在计算机中 (2)为什么是二进制 2.布尔代数 & 逻辑门 (1)什么是布尔代数 (2)基 ...

  4. 什么是Dapp?带你从零开始搭建一个Dapp

    什么是Dapp?零基础带你搭建一个Dapp 前言:Dapp就是去中心化应用,它和我们平时使用的App(微信,支付宝等)只差了一个去中心化,如何理解这一去中心化?从体验层面来说:Dapp中并没有管理者, ...

  5. AI学习笔记(九)从零开始训练神经网络、深度学习开源框架

    AI学习笔记之从零开始训练神经网络.深度学习开源框架 从零开始训练神经网络 构建网络的基本框架 启动训练网络并测试数据 深度学习开源框架 深度学习框架 组件--张量 组件--基于张量的各种操作 组件- ...

  6. 迁移学习实战 | 快速训练残差网络 ResNet-101,完成图像分类与预测,精度高达 98%!...

    作者 | AI 菌 出品 | CSDN博客 头图 | CSDN付费下载自视觉中国 前言 笔者在实现ResNet的过程中,由于电脑性能原因,不得不选择层数较少的ResNet-18进行训练.但是很快发现, ...

  7. Java 从零开始实现一个画图板、以及图像处理功能,代码可复现

    Java 从零开始实现一个画图板.以及图像处理功能,代码可复现 这是一个学习分享博客,带你从零开始实现一个画图板.图像处理的小项目,为了降低阅读难度,本博客将画图板的一步步迭代优化过程展示给读者,篇幅 ...

  8. pytorch训练GAN的代码(基于MNIST数据集)

    论文:Generative Adversarial Networks 作者:Ian J. Goodfellow 年份:2014年 从2020年3月多开始看网络,这是我第一篇看并且可以跑通代码的论文,简 ...

  9. 【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)

    文章目录 前言 代码 修改之前错误的代码 知道为何Z的结果不能拟合到预期的5了 解决办法1:取消输出层神经单元的a和b(直接将z作为输出)(这个办法不行,影响神经单元的完整性,没法计算出输出层神经单元 ...

最新文章

  1. 轻松删除所有安装的gem
  2. Lesson 8.18.2 单层回归神经网络torch.nn.Linear实现单层回归神经网络的正向传播
  3. Convolutional Neural Networks卷积神经网络
  4. centos 安装jdk_CentOS 7 安装 Oracle JDK 8
  5. vue脚手架中使用axios
  6. 树莓派3B上部署运行.net core 2程序
  7. 【iOS系列】-iOS中内存管理
  8. “明年AI会如何?”英伟达问了13位不同行业的专家
  9. 如何动态确认每个输入的值都符合设定域
  10. 云计算时代,观测产品Sunfire的成长史
  11. Linux内核源码如何学习?
  12. 吾身听物化,化及事则休
  13. 九层之台,始于垒土;合抱之木,始于毫末;千里之行,始于足下!
  14. Teams Bot App 初探
  15. 《基于短时分数阶傅里叶变换的时频分析方法》
  16. C语言学生信息管理系统第二版(附带密码登录模式)
  17. 刷脸支付连锁化经营的商业形态完美融合
  18. 一篇文章带你弄懂乐观锁与悲观锁,CAS原子性,synchronized底层原理
  19. java如何创建一个文本框_创建一个有文本框和三个按钮的程序。当按下某个按钮时,使不同的文字(Java..._考试资料网...
  20. 如何实现html做一个粒子漩涡

热门文章

  1. PMC电源管理看门狗:iTCO_wdt
  2. 【研究生版】《漫漫邮子路(五)--我的研究生之路--吕林输》
  3. 按照下面的页面做一个用户注册的Sevlet,要求自己设计表,并将表单的数据写入到表中。
  4. 2021最新版闲鱼过模拟器
  5. 持续集成平台Jenkins:docker镜像升级
  6. 恢复丢失的VMFS分区-适用于esxi5
  7. 帮我写一个关于询问chatGPT进行提问的有效模板需要详细一点
  8. 深度学习笔记-----多输入网络 (Siamese网络,Triplet网络)
  9. 个人整理的淘宝正品鞋店
  10. python 绘画词云图