神经网络基础-手写数字识别

这篇具有很好参考价值的文章主要介绍了神经网络基础-手写数字识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手写数字识别神经网络

基本原理

图像本质上被认为是一个矩阵,每个像素点都是一个对应的像素值,相当于在多维数据上进行相关的归类或者其他操作。

线性函数

线性函数的一个从输入到输出的映射,用于给目标一个每个类别对应的得分。

图像 ( 32 ∗ 32 ∗ 3 ) → f ( x , W ) Y 图像(32*32*3) \stackrel{f(x,W)}{\rightarrow} Y 图像(32323)f(x,W)Y

其中 x x x为3072维的一个向量,
W W W为parameters
Y Y Y为图像对应每个类别对应的得分

f ( x , W ) = W x ( + b ) f(x,W)=Wx(+b) f(x,W)=Wx(+b)

其中 f ( x , W ) f(x,W) f(x,W)是10*1维度
W W W是10*3072维度
x x x是3072*1维度
b b b是10*1维度

神经网络基础-手写数字识别

损失函数

得到了输入图像和分类目标直接对应的每类得分,我们如何去分析衡量分类的结果?我们可以使用损失函数去明确当前模型的效果是好是坏。
损失函数可以表示为:

损失函数 = 数据损失 + 正则化惩罚项

L = 1 N ∑ i = 1 N m a x ( 0 , f ( x i ; W ) j − f ( x i ; W ) y i + 1 ) + λ R ( W ) L=\frac{1}{N} \sum\limits\limits_{i=1}^{N}max(0,f(x_i;W)_j-f(x_i;W)_{y_i}+1)+\lambda R(W) L=N1i=1Nmax(0,f(xi;W)jf(xi;W)yi+1)+λR(W)
其中R(W)项为正则化惩罚项,用于减少模型复杂度,防止过拟合,其中其 λ \lambda λ参数越大惩罚力度越大,也就是我们约不希望他过拟合。
R ( W ) = ∑ k ∑ l W k , l 2 R(W)=\sum\limits_{k}\sum\limits_{l}W _{k,l}^{2} R(W)=klWk,l2

其中一个常用损失函数为
L i = ∑ j ≠ y i m a x ( 0 , s j − s y i + 1 ) L_{i}=\sum\limits_{j \neq y_i}max(0,s_j-s_{y_i}+1) Li=j=yimax(0,sjsyi+1)
在某次训练过程中,几个任务图像的线性函数输出结果如下所示:

神经网络基础-手写数字识别

我们分别计算其损失函数:

= m a x ( 0 , 5.1 − 3.2 + 1 ) + m a x ( 0 , − 1.7 − 3.2 + 1 ) = m a x ( 0 , 2.9 ) + m a x ( 0 , − 0.39 ) = 2.9 \begin{aligned} &=max(0,5.1-3.2+1)+max(0,-1.7-3.2+1) \\ &=max(0,2.9)+max(0,-0.39)\\ &=2.9 \end{aligned} =max(0,5.13.2+1)+max(0,1.73.2+1)=max(0,2.9)+max(0,0.39)=2.9

= m a x ( 0 , 1.3 − 4.9 + 1 ) + m a x ( 0 , 2.0 − 4.9 + 1 ) = m a x ( 0 , − 2.6 ) + m a x ( 0 , − 1.9 ) = 0 \begin{aligned} &=max(0,1.3-4.9+1)+max(0,2.0-4.9+1) \\ &=max(0,-2.6)+max(0,-1.9)\\ &=0 \end{aligned} =max(0,1.34.9+1)+max(0,2.04.9+1)=max(0,2.6)+max(0,1.9)=0

= m a x ( 0 , 2.2 − ( − 3.1 ) + 1 ) + m a x ( 0 , 2.5 − ( − 3.1 ) + 1 ) = m a x ( 0 , 5.3 ) + m a x ( 0 , 5.6 ) = 10.9 \begin{aligned} &=max(0,2.2-(-3.1)+1)+max(0,2.5-(-3.1)+1) \\ &=max(0,5.3)+max(0,5.6)\\ &=10.9 \end{aligned} =max(0,2.2(3.1)+1)+max(0,2.5(3.1)+1)=max(0,5.3)+max(0,5.6)=10.9
我们可以根据本轮损失函数的计算去判断当前分类效果的好坏。
所以损失值我们通过一下流程进行得到:

神经网络基础-手写数字识别

前向传播(梯度下降)

我们知道了当前的模型的性能效果,那么肯定要对模型进行更新来达到一个更佳的状态

暂略

整体架构

神经网络基础-手写数字识别

数据模块

我们可以使用现成的torch中帮忙封装的MNIST数据,通过datasets包可以直接进行下载,并且使用dataloader加载数据。

def data_pre():
    train_data=torchvision.datasets.MNIST(
        root='MNIST',
        train=True,
        transform=torchvision.transforms.ToTensor(),
        download=True
    )
    test_data=torchvision.datasets.MNIST(
        root='MNIST',
        train=False,
        transform=torchvision.transforms.ToTensor(),
        download=True
    )
    train_load=DataLoader(dataset=train_data,batch_size=100,shuffle=True)
    test_load=DataLoader(dataset=test_data,batch_size=100,shuffle=True)
    return train_data, test_data

torchvision.datasets.MNIST参数含义

  • root:

存放训练和测试数据的文件根目录

  • train:(数据类型bool)

如果为True则从training创建数据集,否则从test.pt创建数据集

  • download:(数据类型bool)

如果为ture则从网络上下载数据集并放在根目录下,如果数据已经存在不会进行重复下载

  • transform:(数据类型callable)

对数据内容进行转换处理的函数,具体见torchvision.transforms中的参数设置,此处为将PIL文件转换成tensor的数据格式

DataLoader参数含义

  • dataset:(数据类型 dataset)

PyTorch中的数据集类型。

  • batch_size:(数据类型 int)

每次输入数据的行数,默认为1。PyTorch训练模型时调用数据不是一个一个进行的,而是一批一批输入用于提升效率。这里就是定义每次喂给神经网络多少行数据,如果设置成1,那就是一行一行进行(个人偏好,PyTorch默认设置是1)。

  • shuffle:(数据类型 bool)

洗牌。默认设置为False。在每次迭代训练时是否将数据洗牌,默认设置是False。将输入数据的顺序打乱,是为了使数据更有独立性,但如果数据是有序列特征的,就不要设置成True了。

神经网络框架

class neuralnet():
    def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate):
        self.inodes = input_nodes   # 输入层节点设定
        self.hnodes = hidden_nodes  # 隐藏层节点设定
        self.onodes = output_nodes  # 输出层节点设定
        self.lr = learning_rate     # 学习率设定

        # 初始化w_ih
        # 输入层与隐藏层之间的连接参数
        self.wih = (np.random.normal(0.0, pow(self.hnodes, -0.5),\
                        (self.hnodes, self.inodes)))
        # 隐藏层与输出层之间的连接参数
        self.who = (np.random.normal(0.0, pow(self.onodes,-0.5),\
                        (self.onodes,self.hnodes)))
        # 激活函数,返回sigmoid函数
        self.activation_function = lambda x:spe.expit(x)
    
    
    def train(self, inputs_list, targets_list):
        # 输入进来的二维图像数据
        inputs = np.array(inputs_list, ndmin=2).T
        # 隐藏层计算
        hidden_inputs = np.dot(self.wih, inputs)   
        # 隐藏层的输出经过sigmoid函数处理         
        hidden_outputs = self.activation_function(hidden_inputs)
        # 输出层计算
        final_inputs = np.dot(self.who, hidden_outputs)
        # 输出经过sigmoid函数处理
        final_outputs = self.activation_function(final_inputs)

        # 取得对应的标签
        targets = np.array(targets_list, ndmin=2).T

        # 计算数据预测误差,将其用于向前反馈
        output_errors = targets - final_outputs
        # 根据公式计算得到反向传播参数
        hidden_errors = np.dot(self.who.T,output_errors)

        # 根据反馈参数去修改两个权重
        self.who += self.lr * np.dot((output_errors * final_outputs *(1.0 - final_outputs)),np.transpose(hidden_outputs))  
        self.wih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0-hidden_outputs)), np.transpose(inputs))

    def query(self, inputs_list):
        # 输入进来的二维图像数据
        inputs = np.array(inputs_list, ndmin=2).T
        # 隐藏层计算
        hidden_inputs = np.dot(self.wih, inputs)   
        # 隐藏层的输出经过sigmoid函数处理         
        hidden_outputs = self.activation_function(hidden_inputs)
        # 输出层计算
        final_inputs = np.dot(self.who, hidden_outputs)
        # 输出经过sigmoid函数处理
        final_outputs = self.activation_function(final_inputs)

        return final_outputs

参考

(29条消息) [ PyTorch ] torch.utils.data.DataLoader 中文使用手册_江南蜡笔小新的博客-CSDN博客

(29条消息) 「学习笔记」torchvision.datasets.MNIST 参数解读/中文使用手册_江南蜡笔小新的博客-CSDN博客_torchvision.datasets.mnist

Python scipy.special.expit用法及代码示例 - 纯净天空 (vimsky.com)

002-深度学习数学基础(神经网络、梯度下降、损失函数) - 小小猿笔记 - 博客园 (cnblogs.com)

TensorBoard的最全使用教程:看这篇就够了 - 腾讯云开发者社区-腾讯云 (tencent.com)文章来源地址https://www.toymoban.com/news/detail-430453.html

到了这里,关于神经网络基础-手写数字识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【神经网络手写数字识别-最全源码(pytorch)】

    Torch安装的方法 学习方法 1.边用边学,torch只是一个工具,真正用,查的过程才是学习的过程 2.直接就上案例就行,先来跑,遇到什么来解决什么 Mnist分类任务: 网络基本构建与训练方法,常用函数解析 torch.nn.functional模块 nn.Module模块 读取Mnist数据集 会自动进行下载 784是m

    2024年02月14日
    浏览(37)
  • 用C语言构建一个手写数字识别神经网络

    (原理和程序基本框架请参见前一篇 \\\"用C语言构建了一个简单的神经网路\\\") 1.准备训练和测试数据集 从http://yann.lecun.com/exdb/mnist/下载手写数字训练数据集, 包括图像数据train-images-idx3-ubyte.gz 和标签数据 train-labels-idx1-ubyte.gz. 分别将他们解压后放在本地文件夹中,解压后文件名

    2024年02月14日
    浏览(35)
  • CNN卷积神经网络实现手写数字识别(基于tensorflow)

    卷积网络的 核心思想 是将: 局部感受野 权值共享(或者权值复制) 时间或空间亚采样 卷积神经网络 (Convolutional Neural Networks,简称: CNN )是深度学习当中一个非常重要的神经网络结构。它主要用于用在 图像图片处理 , 视频处理 , 音频处理 以及 自然语言处理 等等。

    2024年02月11日
    浏览(41)
  • pytorch集智-5手写数字识别器-卷积神经网络

    简称:CNN,convolutional neural network 应用场景:图像识别与分类(CNN),看图说话(CNN+RNN)等 优越性:和多层感知机相比,cnn可以识别独特的模式,可以自动从数据中提取特征。一般机器学习需要特征工程,cnn可以自动识别,极大代替或取代了特征工程 和多层感知机原理不同

    2024年01月19日
    浏览(42)
  • PyTorch训练简单的全连接神经网络:手写数字识别

    数据集:MNIST 该数据集的内容是手写数字识别,其分为两部分,分别含有60000张训练图片和10000张测试图片 神经网络:全连接网络 【1】https://www.youtube.com/watch?v=Jy4wM2X21u0list=PLhhyoLH6IjfxeoooqP9rhU3HJIAVAJ3Vzindex=3

    2024年02月16日
    浏览(35)
  • 卷积神经网络(CNN)入门:使用Python实现手写数字识别

    在上一篇文章中,我们介绍了如何使用Python实现一个简单的前馈神经网络。本文将重点介绍卷积神经网络(CNN),这是一种在计算机视觉任务中表现优异的深度学习模型。我们将从卷积神经网络的基本原理开始,介绍卷积层、池化层和全连接层等概念,然后使用Python和Keras库

    2023年04月15日
    浏览(51)
  • (神经网络)MNIST手写体数字识别MATLAB完整代码

            在此次实验中,笔者针对 MNIST 数据集,利用卷积神经网络进行训练与测试,提 出了一系列的改进方法,并对这些改进的方法进行了逐一验证,比较了改进方法与浅层 神经网络的优劣。         首先,笔者对实验中所用的 MNIST 数据集进行了简单的介绍;接着,

    2024年02月03日
    浏览(44)
  • 深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

    本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等。 卷积神经网络是一种多层、前馈型神经网络。从功能上

    2024年02月13日
    浏览(44)
  • 基于python的Keras库构建的深度神经网络手写数字识别模型

    目录 模型训练过程 ①导入所需的库 ②加载手写体数据集,将数据集分为训练集和测试集 ③数据预处理 ④构建模型 ⑤编译模型 ⑥训练模型 ⑦使用测试集进行验证 ⑧输出模型准确率和时间消耗 完整代码如下: 模型训练过程 使用到的数据集为IMDB电影评论情感分类数据集,该

    2024年02月09日
    浏览(43)
  • 入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)

    1.1 问题导入 如图所示,数字五的图片作为输入,layer01层为输入层,layer02层为隐藏层,找出每列最大值对应索引为输出层。根据下图给出的网络结构搭建本案例用到的全连接神经网络 1.2 手写字数据集MINST 如图所示,MNIST数据集是机器学习领域中非常经典的一个数据集,由6

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包