一文速学-让神经网络不再神秘,一天速学神经网络基础-输出层(四)


前言

思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络(比如利用LSTM进行时间序列模型预测),那么就更好向大家解释并且阐述原理了。但是深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。

现在很多竞赛虽然没有限定使用算法框架,但是更多获奖的队伍都使用到了深度学习算法,传统机器学习算法日渐式微。比如2022美国大学生数学建模C题,参数队伍使用到了深度学习网络的队伍,获奖比例都非常高,现在人工智能比赛和数据挖掘比赛都相继增多,对神经网络知识需求也日渐增多,因此十分有必要掌握各类神经网络算法。

博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。


输出层

神经网络在解决不同类型的问题时,使用不同的激活函数来适应任务的需求。对于分类问题和回归问题,我们选择了不同的策略来构建网络。

首先,让我们考虑分类问题。在分类问题中,我们常常面临将数据分成不同类别的挑战。对于二分类问题,这意味着我们需要将数据分为两个可能的类别。在这种情况下,我们选择使用 Sigmoid 函数作为输出层的激活函数。Sigmoid 函数能够将输出值映射到 0 到 1 之间,这使得我们可以将输出视为某个类别的概率。

而在处理多分类问题时,我们的目标是将数据分成多个可能的类别。这时,我们使用 Softmax 函数作为输出层的激活函数。Softmax 函数可以将每个类别的原始分数转换为表示各类别概率的形式。这使得我们能够确定哪个类别最有可能是给定输入的正确类别。

而在回归问题中,我们关心的是预测连续数值的输出,而不是离散的类别。在这种情况下,我们通常不使用激活函数,因为我们希望网络的输出可以取任意实数值,以便与问题的需求相匹配。

综上所述,神经网络在不同问题类型中的激活函数选择是根据问题的性质和目标而定的。通过选择适当的激活函数,我们能够更好地让网络适应不同类型的任务。

一、工作过程

为了方便理解,我们仍然以一个实际案例来进行,采用Softmax来进行多分类。

一个多分类问题,C=4.线性分类器模型最后的输出层包含了四个输出值,分别是:

V=\begin{pmatrix} -3\\ 2\\ -1\\ 0 \end{pmatrix}

经过Softmax处理后,数值转化为如下所示概率:

S=\begin{pmatrix} 0.0057\\ 0.8390\\ 0.0418\\ 0.1135 \end{pmatrix}

 很明显根据计算的概率我们很容易发现S2=0.8390对应的概率最大。Softmax将连续数值转化为相对概率,更利于我们理解。当然如果我们拿到的是[1000,1001,1002],我们会得到inf,如果是[-1000,-999,-1000]还是不行,也会得到-inf。

实际应用中,需要对V进行一些数值处理:即V中的每个元素减去V中的最大值。

def _softmax(x):c=np.max(x)exp_x = np.exp(x-c)return exp_x/np.sum(exp_x)scores = np.array([123,456,789]) 
p = _softmax(scores)
print(p)

 以数值的形式计算可能有些抽象,那么我们以图片分类来举例:

假设我们把猫分为类1,狗为类2,小鸡为类3,如果不属于以上任何一类就分到“其他”,从左到右第一个图是一只小鸡,所以我们将它归为类3,以此类推:

假设我们输入一张猫的图片,其对应的真实标签是0100(类别已经转换成one-hot编码形式)。

真值y为\begin{pmatrix} 0\\ 1\\ 0\\ 0 \end{pmatrix}其中,y^{i=1}是1,其余的都是0,经过Softmax计算之后得到的是预测值y_predict,假设预测值为\begin{pmatrix} 0.3\\ 0.2\\ 0.1\\ 0.4 \end{pmatrix},它是一个包括总和为1的概率的向量,这样的话神经网络计算得到的结果告诉我们猫的概率值分配到20%。般来说,神经网络是将输出值最大的神经元所对应的类别作为识别结果,而且即使使用Softmax函数也只会改变值的大小而不能改变神经元的位置,另外指数函数的运算也需要一定的计算机运算量,因此可以考虑在多分类问题中省去Softmax函数。

二、输出层的神经元个数

输出层中神经元的数量应当根据解决问题的要求来选择。在处理不同问题时,输出层神经元的个数需要进行相应的设置。特别是在分类问题中,我们需要根据类别的数量来决定输出层的神经元数目。以 MNIST(手写数字识别)为例,这是一个将手写数字分为0到9共10个类别的问题,因此在输出层我们会设置10个神经元,每个神经元对应一个数字类别。

基于MNIST数据集的前向传播

MNIST(Modified National Institute of Standards and Technology)数据集是一个广泛应用于计算机视觉领域的经典数据集,用于手写数字识别任务。该数据集由美国国家标准与技术研究所(NIST)创建,并经过修改以便在机器学习研究中使用。

MNIST数据集包含了一系列的手写数字图像,涵盖了0到9的数字。每张图像的尺寸为28x28像素,以灰度图像的形式呈现。数据集共分为两部分:训练集和测试集。

训练集: 训练集包含了60,000张手写数字图像,每张图像都有对应的标签,指明该图像所表示的数字。这些图像和标签被广泛用于训练机器学习模型,特别是用于构建手写数字识别模型。

测试集: 测试集包含了10,000张手写数字图像,同样也带有对应的标签。这些图像用于评估已经训练好的模型在未见过数据上的性能。通过测试集的结果,可以了解模型的泛化能力和准确性。

通过torch直接下载即可:

#MNIST dataset
train_dataset = dsets.MNIST(root = '/ml/pymnist',  #选择数据的根目录train = True,  #选择训练集transform = None,  #不考#MNIST dataset
train_dataset = dsets.MNIST(root = '/ml/pymnist',  #选择数据的根目录train = True,  #选择训练集transform = None,  #不考虑使用任何数据预处理download = True  #从网络上下载图片)
test_dataset = dsets.MNIST(root = '/ml/pymnist',#选择数据的根目录train = False,#选择测试集transform = None, #不考虑使用任何数据预处理download = True #从网络上下载图片)虑使用任何数据预处理download = True  #从网络上下载图片)
test_dataset = dsets.MNIST(root = '/ml/pymnist',#选择数据的根目录train = False,#选择测试集transform = None, #不考虑使用任何数据预处理download = True #从网络上下载图片)

首先我们要初始化网络init_network函数,需要设置weight_scale变量用于控制随机权重,统一将bias设置为1.

def init_network():network={}weight_scale=1e-3network['W1']=np.random.randn(784,50)*weight_scalenetwork['b1']=np.ones(50)network['W2']=np.random.randn(50,100)*weight_scalenetwork['b2']=np.ones(100)network['W3']=np.random.randn(100,10)*weight_scalenetwork['b3']=np.ones(10)return network

之后是进行前向传播过程,这里采用ReLU函数:

def _relu(x):return np.maximum(0,x)
def forward(network,x):w1,w2,w3 = network['W1'],network['W2'],network['W3']b1,b2,b3 = network['b1'],network['b2'],network['b3']a1 = x.dot(w1) + b1z1 = _relu(a1)a2 = z1.dot(w2) + b2z2 = _relu(a2)a3 = z2.dot(w3) + b3y = a3return y

最后我们计算得到最终结果:

network = init_network()
accuracy_cnt = 0
x = test_dataset.test_data.numpy().reshape(-1,28*28)
labels = test_dataset.test_labels.numpy() #tensor转numpy
for i in range((len(x))):y = forward(network,x[i])p = np.argmax(y) #获取概率最高的元素的索引if p == labels[i]:accuracy_cnt += 1
print("Accuracy:"+ str(float(accuracy_cnt)/len(x)*100)+'%')

 

 因为是初始权重,故10分类猜对的概率为10%正常不过,因为我们只是前向传播,没有反向传播,故所有的bias权重都不是最优的。那么下一章我们将为反向传播做好准备,详细讲述一下损失函数的作用,在我之前的文章基本把所有的损失函数都讲了一遍,十分详细完善,推荐大家有能力阅读一下:

损失函数(Loss Function)一文详解-分类问题常见损失函数Python代码实现+计算原理解析

下篇文章着重将讲述实际案例中损失函数的使用以及功能。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5-1-标签及属性

文章目录 语法规范标签规范标签列表通用属性基本布局 页面的组成: HTML(HyperText Markup Language,超文本标记语言)是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言。 HTML5 是下一代 HTM…

vue3+antdesign table实现表格行颜色

实现效果&#xff1a; 代码&#xff1a; html: <a-table:columns"stockColumns":data-source"stockData"class"ant-table-striped":rowClassName"rowClassName"></table> js: const rowClassName computed(() > {re…

Windows下MATLAB调用Python函数操作说明

MATLAB与Python版本的兼容 具体可参看MATLAB与Python版本的兼容 操作说明 操作说明请参看下面两个链接&#xff1a; 操作指南 简单说明&#xff1a; 我安装的是MATLAB2022a和Python3.8.6&#xff08;安装时请勾选所有可以勾选的&#xff0c;包括路径&#xff09;。对应版本安…

归一化的作用,sklearn 安装

目录 归一化的作用&#xff1a; 应用场景说明 sklearn 准备工作 sklearn 安装 sklearn 上手 线性回归实战 归一化的作用&#xff1a; 归一化后加快了梯度下降求最优解的速度; 归一化有可能提高精度(如KNN) 应用场景说明 1&#xff09;概率模型不需要归一化&#xff…

ArrayList与顺序表

文章目录 一. 顺序表是什么二. ArrayList是什么三. ArrayList的构造方法四. ArrayList的常见方法4.1 add()4.2 size()4.3 remove()4.4 get()4.5 set()4.6 contains()4.7 lastIndexOf()和 indexOf(&#xff09;4.8 subList()4.9 clear() 以上就是ArrayList的常见方法&#xff01…

RHCE——九、SELinux

SELinux 一、概念1、作用2、SELinux与传统的权限区别 二、SELinux工作原理1、名词解释主体&#xff08;Subject&#xff09;目标&#xff08;Object&#xff09;策略&#xff08;Policy&#xff09;安全上下文&#xff08;Security Context&#xff09; 2、文件安全上下文查看1…

element——switch接口成功后赋值打开开关

应用场景 基本用法使用v-model双向绑定值&#xff0c;进行开关控制 例子1:需求&#xff1a; **点击switch&#xff0c;出弹窗&#xff0c;点击弹窗保存按钮调接口成功后再赋值&#xff08;row.orderButtonValue“1”&#xff09;打开switch开的状态变颜色。 在vue 中使用 :va…

安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计WebPack打包器第三方库JQuery安装使用安全检测

文章内容 环境搭建-NodeJS-解析安装&库安装安全问题-NodeJS-注入&RCE&原型链案例分析-NodeJS-CTF题目&源码审计打包器-WebPack-使用&安全第三方库-JQuery-使用&安全 环境搭建-NodeJS-解析安装&库安装 Node.js是运行在服务端的JavaScript 文档参考…

分布式事务篇-2.4 Spring-Boot整合Seata

文章目录 前言一、pom jar导入:二、项目配置&#xff1a;2.1 配置 说明&#xff1a;2.1 .1 seata server 端:2.1 .2 seata client 端: 2.2 开启seata 对于数据源的代理:2.3 seata-client 的注册中心&#xff1a;2.4 seata-client 的配置中心&#xff1a;2.5 去掉手写的数据源代…

【第四阶段】kotlin语言的mutator函数学习

1.mutator特性1&#xff1a;使用list可以直接 - fun main() {val list mutableListOf(123,456,789)//特性1 可是直接使用list -list 111list-123println(list) }执行结果 2.mutator特性2&#xff1a;removeIF() 如果实现是true 会自动遍历整个集合&#xff0c;一个一个的移除…

新亮点!安防视频监控/视频集中存储/云存储平台EasyCVR平台六分屏功能展示

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【Robot Framework】发送GET和POST请求

做接口自动化时&#xff0c;经常要使用GET与POST请求&#xff0c;那么如何使用RF发送对应的请求呢&#xff1f; 一、安装RequestsLibrary pip install robotframework-requests安装以后&#xff0c;导入到对应的测试套件或测试用例中. 本次主要介绍通过RequestsLibrary来实现…

【状压+概率DP】CF678 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;n < 18&#xff0c;应当想到状压 很明显&#xff0c;这里可以使用状压DP 设 dp[s][i] 表示&#xff0c;现在选的方案为 s &#xff0c;且我是 i 的最终胜利的概率是多少 重要的是转移 这是…

数学建模——校园供水系统智能管理

import pandas as pd data1pd.read_excel("C://Users//JJH//Desktop//E//附件_一季度.xlsx") data2pd.read_excel("C://Users//JJH//Desktop//E//附件_二季度.xlsx") data3pd.read_excel("C://Users//JJH//Desktop//E//附件_三季度.xlsx") data4…

飞天使-python的模块与包与装饰器

文章目录 模块与包标准模块第三方模块自定义模块 高级语法切片迭代器/生成器高级模式&#xff08;闭包&#xff09;高级模式&#xff08;装饰器&#xff09; 参考视频 模块与包 标准模块 import os print(os.getcwd())import sys print(sys.argv) print(sys.platform) print(…

ETC reset

ETC重新激活 换前挡风玻璃膜会把ETC设备拿下来&#xff0c;需要到【ETC服务中心】重新【粘上去】&#xff0c;另外需要工作人员用手持终端【重新激活】 ETC 背面有个 【白色】开关小柱子&#xff0c;一旦拆下来就失效&#xff0c;因为这个开关弹出来了 截面图看就是这样的&…

万人在线,一站式自动化运维 SysOM 3.0重磅发布!龙蜥社区系统运维 MeetUp 回顾来了

8 月 12 日&#xff0c;由龙蜥社区系统运维 SIG 主办&#xff0c;乘云数字协办的&#xff0c;主题为“观测&#xff0c;让运维更简单&#xff01;”的系统运维 MeetUp 于杭州圆满结束。来自乘云数字、谐云科技、乐维、云杉网络、擎创科技、观测云、阿里云以及浙江大学等众多厂商…

Linux 多线程同步机制(上)

文章目录 前言一、线程同步二、互斥量 mutex三、死锁总结 前言 一、线程同步 在多线程环境下&#xff0c;多个线程可以并发地执行&#xff0c;访问共享资源&#xff08;如内存变量、文件、网络连接 等&#xff09;。 这可能导致 数据不一致性, 死锁, 竞争条件等 问题。 为了解…

医院常见的HIS、CIS、LIS、EMR、PACS、RIS医疗信息化中的介绍

医院常见的HIS、CIS、LIS、EMR、PACS、RIS分别是&#xff1a; HIS&#xff08;Hospital Information System&#xff09;&#xff1a;医院信息系统&#xff0c;是医院管理信息化的核心系统&#xff0c;包括病人管理、医生管理、药品管理、医疗设备管理、财务管理等多个方面&am…

Unity插件---Dotween

1.什么是DOTween DoTween 是由 Demigiant 开发的&#xff0c;被广泛应用于 Unity 游戏开发中。它是一个流行的动画插件&#xff0c;被许多开发者用于创建流畅、高效的动画效果&#xff0c;提升游戏体验。 2.DOTween的初始配置 ①set up 首先找到DOTween Unity Panel 的面板 点…