深度学习:使用全连接神经网络FCN实现MNIST手写数字识别

全连接神经网络(DNN) 最近想要学习深度学习模型,没有一上来就先学习CNN、RNN、LSTM,而是先学习全连接神经网络(Fully Connected Neural Network),原因非常简单,上述所说的各种神经网络都是基于全连接神经网络出发的,最基础的原理都是由反向传播而来,所以只要掌握了这节最基本的原理,接下来的各种网络也能学得得心应手。 一、全连接神经网络简介 全连接神经网络模型是一种多层感知机(MLP),感知机的原理是寻找类别间最合理、最具有鲁棒性的超平面,最具代表的感知机是SVM支持向量机算法。神经网络同时借鉴了感知 阅读详情

1 引言

本项目构建了一个全连接神经网络(FCN),实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等。

2 全连接神经网络介绍

2.1 什么是全连接神经网络

全连接网络(Fully-Connected Network,简称FCN),即在多层神经网络中,第nN层的每个神经元都分别与第N-1层的神经元相互连接。如下图便是一个简单的全连接网络:

2.2 损失函数

损失函数(loss function)在深度学习领域是用来计算搭建模型预测的输出值和真实值之间的误差,是一种衡量模型与数据吻合程度的算法。损失函数的值越高预测就越错误,损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数(loss function)的值取平均值的函数称为代价函数(cost function),更简单的理解就是损失函数是针对单个样本的,而代价函数是针对所有样本的。

  • 损失函数越小越好
  • 计算实际输出与目标之间的差距
  • 为更新输出提供依据(反向传播)

常见的损失函数

(1)均方误差损失(Mean Squared Error,MSE)

均方误差损失MSE,又称L2 Loss,用于计算模型输出y_hat 和目标值y 之差的均方差。一般用在线性回归中,可以理解为最小二乘法。均方差损失是机器学习、深度学习回归任务中最常用的一种损失函数 。

(2)平均绝对误差(Mean Absolute Error,MAE)

平均绝对误差MAE,又称L1 Loss,是另一种用于回归模型的损失函数。和 MSE 一样,这种度量方法也是在不考虑方向(如果考虑方向,那将被称为平均偏差(Mean Bias Error, MBE),它是残差或误差之和)的情况下衡量误差大小。但和 MSE 的不同之处在于,MAE 需要像线性规划这样更复杂的工具来计算梯度。此外,MAE 对异常值更加稳健,因为它不使用平方。损失范围也是 0 到 ∞。

(3)交叉熵损失函数(Cross Entropy Loss)

交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。语言模型的性能通常用交叉熵和复杂度(perplexity)来衡量。交叉熵的意义是用该模型对文本识别的难度,或者从压缩的角度来看,每个词平均要用几个位来编码。Cross Entropy损失函数是分类问题中最常见的损失函数。

2.3 反向传播

误差反向传播(Back-propagation, BP)算法的出现是神经网络发展的重大突破,也是现在众多深度学习训练方法的基础。该方法会计算神经网络中损失函数对各参数的梯度,配合优化方法更新参数,降低损失函数。BP本来只指损失函数对参数的梯度通过网络反向流动的过程,但现在也常被理解成神经网络整个的训练方法,由误差传播、参数更新两个环节循环迭代组成。

神经网络的训练过程中,前向传播和反向传播交替进行,前向传播通过训练数据和权重参数计算输出结果;反向传播通过导数链式法则计算损失函数对各参数的梯度,并根据梯度进行参数的更新

3 使用FCN实现MNIST手写数字识别

3.1 MINIST数据集介绍

MNIST数据集是美国国家标准与技术研究院收集整理的大型手写数字数据库,包含60,000个示例的训练集以及10,000个示例的测试集。其中的图像的尺寸为28*28。采样数据显示如下:

3.2 FCN识别MINIST数据集代码实现

import torch
from torch import nn
from torchvision import datasets
from torchvision.transforms import transforms
import matplotlib.pyplot as plt
import numpy as np

class MnistNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer = nn.Sequential(
            # 图片的原尺寸为28*28,转化为784,输入层为784,输出层为256
            nn.Linear(784, 256),
            nn.ReLU(),
            nn.Linear(256, 64),
            nn.ReLU(),
            nn.Linear(64, 16),
            nn.ReLU(),
            nn.Linear(16, 10),
            nn.Softmax(dim=1)
        )

    def forward(self, x):
        x = x.view(-1, 28*28*1)
        return self.layer(x)


batchsize = 32
lr = 0.01

transform = transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.1307, ), (0.3081,))])

data_train = datasets.MNIST(root="./data/", transform=transform, train=True, download=True)
data_test = datasets.MNIST(root="./data/", transform=transform, train=False)

train_loader = torch.utils.data.DataLoader(data_train, batch_size=batchsize, shuffle=True)
test_loader = torch.utils.data.DataLoader(data_test, batch_size=batchsize, shuffle=False)

if __name__ == '__main__':
    model = MnistNet()

    criterion = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.5)

    for i in range(5):
        plt.subplot(1, 5, i + 1)
        plt.xticks([])
        plt.yticks([])
        plt.imshow(data_train.data[i], cmap=plt.cm.binary)
    plt.show()

    lepoch = []
    llost = []
    lacc = []
    epochs = 30
    for epoch in range(epochs):
        lost = 0
        count = 0
        for num, (x, y) in enumerate(train_loader, 1):
            y_h = model(x)
            loss = criterion(y_h, y)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            lost += loss.item()
            count += batchsize
        print('epoch:', epoch + 1, 'loss:', lost / count, end=' ')
        lepoch.append(epoch + 1)
        llost.append(lost / count)

        with torch.no_grad():
            acc = 0
            count = 0
            for num, (x, y) in enumerate(test_loader, 1):
                y_h = model(x)
                _, y_h = torch.max(y_h.data, dim=1)
                acc += (y_h == y).sum().item()
                count += x.size(0)
            test_acc = acc / count * 100

        lacc.append(test_acc)
        print('acc:', test_acc)

    plt.plot(lepoch, llost, label='loss')
    plt.plot(lepoch, lacc, label='acc')
    plt.legend()
    plt.show()

3.3 结果输出

经过30个epoch后,在测试集上的准确率达到了97.3%

epoch: 1 loss: 0.0697015597740809 acc: 56.120000000000005
epoch: 2 loss: 0.0542279725531737 acc: 81.2
epoch: 3 loss: 0.051337766939401626 acc: 83.53
epoch: 4 loss: 0.05083678769866626 acc: 84.49
epoch: 5 loss: 0.05052243163983027 acc: 85.09
epoch: 6 loss: 0.05029139596422513 acc: 85.65
epoch: 7 loss: 0.050102355525890985 acc: 86.14
epoch: 8 loss: 0.04994755889574687 acc: 86.02
epoch: 9 loss: 0.0498184863169988 acc: 86.71
epoch: 10 loss: 0.04970114469528198 acc: 86.81
epoch: 11 loss: 0.04792855019172033 acc: 94.86
epoch: 12 loss: 0.047099880089362466 acc: 95.64
epoch: 13 loss: 0.04690476657748222 acc: 96.04
epoch: 14 loss: 0.04677621142864227 acc: 96.32
epoch: 15 loss: 0.046683601369460426 acc: 96.52
epoch: 16 loss: 0.04659009942809741 acc: 96.69
epoch: 17 loss: 0.04652327968676885 acc: 96.72
epoch: 18 loss: 0.04646410925189654 acc: 96.81
epoch: 19 loss: 0.0464125766257445 acc: 96.75
epoch: 20 loss: 0.04636456128358841 acc: 97.07000000000001
epoch: 21 loss: 0.046326734560728076 acc: 96.85000000000001
epoch: 22 loss: 0.04628034559885661 acc: 96.91
epoch: 23 loss: 0.04625135076443354 acc: 97.0
epoch: 24 loss: 0.046217381453514096 acc: 97.14
epoch: 25 loss: 0.046193461724122364 acc: 97.03
epoch: 26 loss: 0.046168098962306975 acc: 97.16
epoch: 27 loss: 0.0461397964378198 acc: 97.27
epoch: 28 loss: 0.0461252645790577 acc: 97.22
epoch: 29 loss: 0.04609716224273046 acc: 97.19
epoch: 30 loss: 0.04608173056840897 acc: 97.3

准确率变化曲线如下:

神经网络全连接层的作用,各种神经网络的优缺点 1、全连接神经网络解析:对n-1层和n层而言,n-1层的任意一个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权。2、全连接的神经网络示意图:3、“全连接”是一种不错的模式,但是网络很大的时候,训练速度回很慢。部分连接就是认为的切断某两个节点直接的连接,这样训练时计算量大大减小。... 阅读详情

相关推荐

深度学习(五)-全连接神经网络实现 MNIST 手写数字分类

  前面我们讲了这么多理论知识,下面我们来简单的来一个实战学习,利用全连接神经网络实现 MNIST 手写数字分类。MNIST数据集是一个手写体数据集,包括 0~9 这 10 个数字,图片大小是 28 x 28 的灰度图。数据集由四部分组成,分别是: 其内容为: 数据处理   在开始训练网络之前,良好的数据预处理和参数初始化可以使训练效率更高,效果更优 。如果有了解机器学...

未名湖畔的落叶 1万+

tensorflow学习之路-全连接层的理解

卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。 全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。 先看全连接的图: 全连接把卷积输...

WHACKW的专栏 2306

PyTorch手写数字识别实战:从环境配置到CNN模型实现

本文详细介绍了使用PyTorch实现手写数字识别的完整流程。首先讲解Anaconda环境配置和GPU环境搭建,然后通过MNIST数据集进行数据加载和预处理。文章对比了全连接网络(FCN)和卷积神经网络(CNN)两种模型结构,详细展示了训练过程、性能评估和结果可视化。实验表明CNN模型凭借局部感知和参数共享等特性,识别准确率可达99%,显著优于FCN的97%。最后提供了学习率调度、数据增强等优化技巧,并讨论了模型在实际应用中的扩展可能性。该教程适合深度学习初学者入门实践。

weixin_74767968的博客 2883

全连接神经网络实现MNIST手写数字识别

深度学习神经网络实现MNIST手写数字识别

zzp20031120的博客 2830

图像识别-MNIST分类问题

摘要 本报告基于美国国家标准与技术研究院收集整理的MNIST手写数字数据集。在当前时代背景下,仍有大量手写数字需要处理,对它们的识别及分类是解决问题的关键。对此,本论文中练习并体会了MNIST数据集中手写数据的分类。论文主要内容包括:实验过程的记录,实验结果的简要分析,相关方法的介绍。实验过程由Python实现,使用了AutoEncoder降维方法及MLP、FCN分类方法,通过比较两种分类方法的准确率得到最终结论。 关键词:手写数字识别;超高维数据;数据分类 ABSTRACT This report is

weixin_45753078的博客 2571

使用全连接神经网络实现MNIST手写数字识别:从原理到实践

训练集:60,000张图像测试集:10,000张图像图像格式:28×28像素灰度图(0-255)标签:0-9共10个类别"""四层全连接神经网络"""理解MNIST数据集特性设计全连接神经网络结构推导前向传播数学公式实现训练和预测代码保存和部署训练好的模型全连接神经网络虽然在复杂图像任务上不如CNN,但作为入门项目,它能帮助我们理解神经网络的基本原理和工作流程。扩展阅读。

Ven%的博客 271

全连接神经网络——MINST手写数字识别

本文构建了一个全连接神经网络(FCN),实现对MINST数据集手写数字的识别,没有借助任何深度学习算法库,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等。最终的代码总行数不超过200行,并有详细的注释,很大程度上能够帮助理解。

whxhy666的博客 5351

深度学习:TensorFlow实现CNN手写字识别

TensorFlow实现卷积神经网络手写字识别;MNIST数据集

天涯雨的博客 1905

Pytorch与深度学习 —— 2.用全连接神经网络识别手写数字数据集MNIST(Fully Connected Neural Network)

文章目录题外话:目前的AI能做什么数据集!数据集!数据集!目前可用的开源数据集 题外话:目前的AI能做什么 目前我们使用AI技术,最主要的应用方向在四大类,其中之一时自然语言处理(NLP:Nature Language Processing),它包含语音识别、声音识别、语义分析、文本分析等; 而对于数字图像处理(Digial Image Processing),包含人脸检测、人体体态识别、物体识别、运动识别、图像分离等,最近这几年随着AI的兴起和技术积累,沉积多年的计算机图形技术也重新焕发生机,出现一些虚拟

老程的技术笔记 3329

FCN手写数字识别项目实战

深度学习的概念最早可以追溯到20世纪80年代,当时的神经网络研究为后来的发展奠定了基础。但直到2006年,Hinton等人提出的深度信念网络(DBN)才正式拉开了深度学习的序幕。随后,随着计算能力的提升和大数据时代的到来,深度学习在图像识别、语音识别、自然语言处理等领域取得了突破性的进展。特别是卷积神经网络(CNN)在图像处理领域表现出色,成为深度学习技术中最耀眼的一颗星。MNIST数据集是由美国国家标准与技术研究院(NIST)创建的大型手写数字数据库。

weixin_36328210的博客 981

MNIST数字识别项目:使用Python和TensorFlow实现深度学习

本文还有配套的精品资源,点击获取 简介:MNIST是一个广泛用于机器学习和深度学习的数字识别数据集,包含成千上万的手写数字图像。本项目通过Python和TensorFlow框架,采用深度学习方法,实现手写数字的识别。项目涵盖了从数据预处理到模型构建、训练、评估和预测的全流程。特别地,本项目以“mnist.py”为核心脚本,详细展示了如何操作MNIST数据集,并通过构建深度神...

weixin_33608403的博客 1744

【深度学习项目一】全连接神经网络实现mnist数字识别

深度学习开发的万能公式 模式流程: import paddle import numpy as np import matplotlib.pyplot as plt 2 数据准备 2.1 数据加载和预处理 import paddle.vision.transforms as T # 数据的加载和预处理 transform = T.Normalize(mean=[127.5], std=[127.5]) #里面数值是根据数据集进行设置的 #像素值分布0-255组成图片,差值比较大会影响loss,影

丨汀、的博客 1914

Pytorch入门:MNIST数据集手写数字分类指南

PyTorch是一个开源的机器学习库,提供了一种灵活的框架,使得研究人员和开发人员可以轻松地实现复杂的神经网络架构。自2016年由Facebook推出以来,PyTorch已经迅速成为了深度学习领域里最受欢迎的库之一,它之所以备受欢迎,主要归功于它的动态计算图和易用性。手写数字识别是计算机视觉领域的经典问题,具有广泛的应用场景。从邮政编码的自动识别,到银行支票数字的验证,再到各种电子设备中数字的输入,手写数字识别技术在日常生活中扮演着不可或缺的角色。

weixin_36238982的博客 1154

DL1 mnist手写数字识别

【深度学习入门】mnist手写数字识别的两种实现

m0_52231957的博客 335

掌握深度学习:MNIST数字识别实战指南

MNIST是一个广泛使用的手写数字识别数据集,由60,000张训练图像和10,000张测试图像组成,每张图像是28x28像素的灰度图。该数据集的引入对于机器学习尤其是深度学习的发展起到了极大的推动作用,常被用于验证各种机器学习算法和深度学习模型的有效性。深度学习模型由不同的层和组件构成,每一层和组件都有其独特的功能和作用。理解这些基础概念,可以帮助我们更好地设计和调整模型结构。

weixin_35750483的博客 1121

小白入门:手写数字识别MNIST实践

net = MNIST_Net()是我们之前搭建的神经网络模型的实例化,net.load_state_dict(torch.load('fcn_mnist_ckpt.pt', map_location='cpu'))这里你肯定会疑惑为啥有这个方法load_state_dict(),不是只写了两个方法吗,别忘了我们继承了nn.Module。由输入到输出的过程就是前向传播,它的结果表示输入数据经过我们搭建的模型所得到的结果,在本次实践中,我们输入由0到9的图片的读取参数,最后得到它识别的结果。

2401_86179035的博客 810

使用keras全连接网络训练mnist手写数字识别并输出可视化训练过程以及预测结果

前言 mnist 数字识别问题的可以直接使用全连接实现但是效果并不像CNN卷积神经网络好。Keras是目前最为广泛的深度学习工具之一,底层可以支持Tensorflow、MXNet、CNTK、Theano 准备工作 TensorFlow版本:1.13.1 Keras版本:2.1.6 Numpy版本:1.18.0 matplotlib版本:2.2.2 导入所需的库 from keras.layers import Dense,Flatten,Dropout from keras.datasets imp

番茄Salad 2331

深度学习实战:基于MNIST的手写数字分类项目详解

Keras提供基类,允许用户注入训练流程中的任意逻辑。

weixin_42592399的博客 846
上一篇: 机器学习:训练集与测试集分割train_test_split
下一篇: 数据分析三剑客之一:Matplotlib详解与实战
源启智能
博客等级 码龄20年 3万+粉丝 285原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源启智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值