MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss

损失函数

  • 1.激活函数
  • 2.损失函数
    • 2.1均方误差损失函数
    • 2.2交叉熵损失函数
    • 2.3 NLLLoss()
    • 2.4 BCELoss()

1.激活函数

全连接网络又叫多层感知器,多层感知器的基本单元神经元是模仿人类神经元兴奋与抑制机制,对其输入进行加权求和,若超过某一阈值则该人工神经元输出为1,否则输出为0。即 原初的激活函数为阶跃函数。由于,sigmoid函数便于求导,便于求导。(因为要优化w,所以要求激活函数应该连续,能够对权重w可求导)。所以实际应用使用的激活函数为sigmoid函数。
小结激活函数的特点: 连续的光滑函数,便于求导。
在这里插入图片描述
在这里插入图片描述
sigmoid函数阶跃函数的平滑近似。

2.损失函数

神经网络中的损失函数用于衡量网络输出期望输出的之间的差距。当神经网络用于多类别分类时,网络输出数据与标签一般采用 one-hot向量进行编码。

如神经网络用于MNIST手写数字的识别,每张图片输入网络后,将输出一个10维的向量Y,10维向量的第k维可以看成是该图片是数字k的概率,那么,这张图片最有可能是输出向量的最大维度对应的数字。

损失函数是用于衡量差距的,换一句话说,当网络输出与期望输出越接近时,损失函数值应该越小。并且当网络输出==期望输出时,损失函数应该为0,也就是说,损失函数具有非负性。小结损失函数的两点特性:
(1).网络输出与期望输出越接近时,损失函数值应该越小;
(2)损失函数具有非负性
只要满足以上两点约束的函数都能设计成损失函数,在实际应用中,一个设计良好的损失函数可能会引发一场新的研究热潮。因此,损失函数的设计也是神经网络研究中一块重要的内容。

本文以下总结常用的一些损失函数,并且,附上pytorch相应实例函数。

2.1均方误差损失函数

在这里插入图片描述
来自官网的解释:求的是网络输出向量x目标向量y 之间的均方差,每一维度的求差、求平方、求和、求平均。如果将reduction=‘sum’,那么只到求和,不求平均。

均方误差损失函数使用例子:

loss = nn.MSELoss()
input = torch.randn(3, 10, requires_grad=True)
target = torch.randn(3, 10)
output = loss(input, target)
output.backward()

损失函数输入数据格式要求(3为minibatch的大小):Input: (3, 10),Target: (3, 10)
均方差损失函数常用与回归问题,利用神经网络拟合一个复杂函数f(x)f(x)f(x),网络的最后一层可以依据需要设置不同的激活函数。例如,在输出为一维时,可以直接采用全连接层。

2.2交叉熵损失函数

交叉熵概念源于信息论, 用于衡量估计模型概率分布真实概率分布之间的差异,随机变量X~p(n),q(n) 为p(n) 的近似概率分布,则随机变量X与模型 q 之间的交叉熵为:
H(X,q)=−∑np(n)logq(n)H(X,q)=-\sum_np(n)logq(n)H(X,q)=np(n)logq(n)
通过数学推导可得,交叉熵=随机变量的熵+真实分布与模型分布的差距
H(X,q)=H(X)+D(p∣∣q)H(X,q)=H(X)+D(p||q)H(X,q)=H(X)+D(pq)

其中,D(p∣∣q)D(p||q)D(pq)为相对熵,H(X)H(X)H(X)为随机变量的熵。因为,在同一随机变量的前提下(H(X)相同),真实分布与模型分布的差距(即相对熵D(p∣∣q)D(p||q)D(pq))越小,则交熵越小。也就是说, 交叉熵满足 损失函数的两条特性。所以可以采用交叉熵作为损失函数。

交叉熵衡量的是两个两个概率分布之间的差距,所以,全连接网络的最后一层输出应该采用softmax() 函数,将输出转化为概率分布;期望输出(标签向量)采用onehot编码。网络最后一层的加权输出向量xxx通过softmax()softmax()softmax()激活后得到输出分布向量z:
zk=softmax(x)k=exk∑iexiz_k=softmax(x)_k=\frac{e^{x_k}}{\sum_ie^{x_i} }\\ zk=softmax(x)k=iexiexk
计算网络输出目标输出之间的交叉熵
Loss(z,label)=H(z,label)=−logexj∑iexiLoss(z,label)=H(z,label)=-log\frac{e^{x_j}}{\sum_ie^{x_i} } Loss(z,label)=H(z,label)=logiexiexj
其中,jjj为llabellabellabel中为1 的维度,也就是,待检测目标所属的类别。

因为,上面两个式子可以化简,直接取最后的结果:

Loss(x,label)=−logexj∑iexiLoss(x,label)=-log\frac{e^{x_j}}{\sum_ie^{x_i}} Loss(x,label)=logiexiexj

(本文最重要的事情)
所以,在pytorch 中CrossEntropyLoss() 函数的输入为:最后一层全连接的加权输出向量(不经过softmax()激活),和期望输出的onehot编码中为1的位置(类别标号,是一个标量,如手写数字识别,真实数字8的标号为7)。如果是批次数据,那就是每个数据交叉熵的求和求均值。
在这里插入图片描述
简单的例子:手写数字识别问题(1,2,3),网络输出采用的one-hot 编码,实际上是一个概率分布。即给定一张数字为1的图像,经过神经网络处理过后,最期待网络输出的应该是:[1,0,0]。也就是说图片为1的概率为1:p(图片为1)=1p(图片为1)=1p(1)=1p(图片为2)=0p(图片为2)=0p(2)=0p(图片为3)=0p(图片为3)=0p(3)=0。但网络实际输出[0.5,0.2,0.3](也应该是一个概率分布),也就是说q(图片为1)=0.5q(图片为1)=0.5q(1)=0.5q(图片为2)=0.2q(图片为2)=0.2q(2)=0.2q(图片为3)=0.3q(图片为3)=0.3q(3)=0.3。依据公式计算交叉熵。

交叉差熵损失函数使用例子:

loss = nn.CrossEntropyLoss()
input = torch.randn(3, 10), requires_grad=True) #minibatch=3,即3行,每一行为一个10维向量
target = torch.empty(3, dtype=torch.long).random_(10) # 1行,3列,每一列的数字为0-10之间的整数
output = loss(input, target)
output.backward()

2.3 NLLLoss()

同时,pytorch 还提供了nn.LogSoftmax()与NLLLoss()的组合,实现交叉熵损失函数。此时,网络的最后一层加权输出,要经过nn.LogSoftmax()进行激活;
NLLLoss()使用例子:

m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
#input is of size N x C = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
#each element in target has to have 0 <= value < C
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
output.backward()

在这里插入图片描述
在这里插入图片描述

2.4 BCELoss()

pytorch 提供了二元交叉熵损失函数,用于处理二分类问题。
在这里插入图片描述简单情况:单个样本时,最后一层网络输出应该为概率值,表示这个样本是一个类别的概率。因此,最后一层的输出应为sigmoid()[sigmoid()函数与概率对应关系再论]。因此这个网络输出与目标输出之间的交叉熵为:
ln=−(ynlogxn+(1−yn)log(1−xn))l_n=-(y_nlogx_n+(1-y_n)log(1-x_n))ln=(ynlogxn+(1yn)log(1xn))
yny_nyn为第n 个样本为真的概率,xnx_nxn第n 个样本为真的网络输出概率。在实际二分类问题中,y_n为0或者1(标签设置准则)。

官网文档连接(英文):https://pytorch.org/docs/stable/nn.html

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

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

相关文章

Java的IO总结

非流式文件类--File类 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等&#xff0c;以下是文件操作常用的函数。 File类是对文件系统中文件以及文…

深度学习(02)-- ANN学习

文章目录目录1.神经网络知识概览1.1深度学习顶会1.2相关比赛1.3神经网络知识概览1.4神经网络编程一般实现过程2.简单神经网络ANN2.1 数据集&#xff1a;2.2 网络结构&#xff1a;2.3 代码实现2.3.1 读取数据&#xff0c;并做处理2.3.2 构建网络结构2.3.3 训练网络目录 1.神经网…

python(11)-if语句,断言assert

分支语句if1.if基本语法2 if语句的嵌套3 比较运算符号4 逻辑运算符&#xff1a;5 整数随机数初应用6 tip7.断言assert1.if基本语法 if语句开发中的应用场景&#xff1a;如果条件成立做一件事情&#xff0c;如果条件不成立做另外一件事情。有了if语句&#xff0c;程序有了分支.…

深度学习(03)-- CNN学习

文章目录目录1.CNN学习2.Keras深度学习框架目录 1.CNN学习 卷积神经网络CNN总结 从神经网络到卷积神经网络&#xff08;CNN&#xff09;我们知道神经网络的结构是这样的&#xff1a; 那卷积神经网络跟它是什么关系呢&#xff1f;其实卷积神经网络依旧是层级网络&#xff0c;…

PaperNotes(1)-Modeling the World from Internet Photo Collections

从网络图片集对世界进行建模AbstractIntroduction2 Previous Work2.1特征匹配2.2 稀疏重建2.3 基于图像建模2.4 基于图像的渲染2.5 图像浏览&#xff0c;检索和注释3 Overview概述4 Reconstructing Cameras and Sparse Geometry&#xff08;相机标定与稀疏重建&#xff09;4.1K…

深度学习(04)-- 典型CNN结构(LeNet5 ,AlexNet)

LeNet5 LeNet5可以说是最早的卷积神经网络了&#xff0c;它发表于1998年&#xff0c;论文原文Gradient-Based Learning Applied to Doucment Recognition作者是Yann Le Cun等。下面对LeNet5网络架构进行简单的说明&#xff0c;有兴趣的同学可以去参考原文&#xff0c;论文原文…

CNN的几种经典模型

本文主要介绍一下CNN的几种经典模型比较。之前自己也用过AlexNet和GoogleNet&#xff0c;网络上关于各种模型的介绍更是形形色色&#xff0c;自己就想着整理一下&#xff0c;以备自己以后查阅方便 LeNet5 先放一张图&#xff0c;我感觉凡是对深度学习有涉猎的人&#xff0c;对…

PaperNotes(2)-Generative Adversarial Net-代码实现资料

Generative Adversarial Nets-生成对抗网络Abstract1.Introduction2.Related work3.Adversarial nets4.Theoretical Results4.1全局最优 pgpdatap_gp_{data}pg​pdata​4.2算法1的收敛性质5.Experiments6.Advantagesa and disadvantages7.Conclusions and future work8.GAN-代码…

深度学习(05)--典型CNN结构(VGG13,16,19)

文章目录目录1.VGG结构2.VGG结构解释3.3*3卷积核的优点4.VGG的muti-scale方法5.VGG的应用目录 1.VGG结构  LeNet5用大的卷积核来获取图像的相似特征  AlexNet用99、1111的滤波器  VGG 巨大的进展是通过依次采用多个 33 卷积&#xff0c;模仿出更大的感受野&#xff08;r…

redis——发布和订阅

频道的订阅和退订 当一个客户端执行 SUBSCRIBE 命令&#xff0c; 订阅某个或某些频道的时候&#xff0c; 这个客户端与被订阅频道之间就建立起了一种订阅关系。 Redis 将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典里面&#xff0c; 这个字典的键是某个被订…

redis——事务

Redis 事务可以一次执行多个命令&#xff0c; 并且带有以下三个重要的保证&#xff1a; 批量操作在发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行&#xff0c;事务中任意命令执行失败&#xff0c;其余的命令依然被执行。在事务执行过程&#xff0c;其他客户端…

深度学习(06)-- Network in Network(NIN)

文章目录目录1.NIN 结构2.MLP卷积3.全局均值池化4.总体网络架构5.NIN补充5.1 广义线性模型&#xff08;GLM&#xff09;的局限性5.2 CCCP层5.3 1*1卷积核作用&#xff08;补充&#xff09;6.手势识别RGB图像--NIN结构目录 1.NIN 结构 2.MLP卷积 传统CNN的局部感受野窗口的运算…

Pytorch(2)-tensor常用操作

tensor常用数学操作1. 随机数1.1 torch.rand() - 均匀分布数字1.2 torch.randn() - 正态分布数字2. 求和2.1 torch.sum(data, dim)2.2 numpy.sum(data, axis)3. 求积3.1 点乘--对应位置相乘3.2 矩阵乘法4. 均值、方差4.1 torch tensor.mean() .std()4.2 numpy array.mean() .st…

深度学习(07)-- 经典CNN网络结构(Inception (v1-v4))

文章目录目录1.Inception介绍1.1 Inception结构1.2 Inception V1(GoogleNet)1.3 Inception V2(Batch Norm)1.4 Inception V3&#xff08;Factorization&#xff09;1.5 Inception V4&#xff08;ResNet&#xff09;1.5 Inception v1~v4 总结1.6 Inception进阶2.Inception实现目…

Python(13)-函数,lambda语句

函数1 函数定义2 函数调用3 函数注释文档4 函数参数4.1 参数列表,默认参数,任意参数4.1.1 无缺省值参数4.1.2&#xff08;部分&#xff09;缺省值参数4.1.3 数量不定形参数4.2 可变对象和不可变对象4.3 作用域4.3.1 globals()函数4.3.2 global 声明变量为全局变量5 函数返回值5…

深度学习(08)-- Residual Network (ResNet)

文章目录目录1.残差网络基础1.1基本概念1.2VGG19、ResNet34结构图1.3 梯度弥散和网络退化1.4 残差块变体1.5 ResNet模型变体1.6 Residual Network补充1.7 1*1卷积核&#xff08;补充&#xff09;2.残差网络介绍&#xff08;何凯明&#xff09;3.ResNet-50(Ng)3.1 非常深的神经网…

redis——命令请求的执行过程

发送命令请求 当用户在客户端中键入一个命令请求时&#xff0c; 客户端会将这个命令请求转换成协议格式&#xff0c; 然后通过连接到服务器的套接字&#xff0c; 将协议格式的命令请求发送给服务器。 读取命令请求 当客户端与服务器之间的连接套接字因为客户端的写入而变得可…

深度学习(09)-- DenseNet

文章目录目录1.DenseNet网络结构2.稠密连接及其优点3.代码实现4.补充说明目录 1.DenseNet网络结构 2.稠密连接及其优点 每层以之前层的输出为输入&#xff0c;对于有L层的传统网络&#xff0c;一共有L个连接&#xff0c;对于DenseNet&#xff0c;则有L*(L1)/2。 这篇论文主要…

redis——缓存击穿/穿透/雪崩

缓存穿透 一般的缓存系统&#xff0c;都是按照key去缓存查询&#xff0c;如果不存在对应的value&#xff0c;就去后端系统查找&#xff08;比如DB&#xff09;。 一些恶意的请求会故意查询不存在的key,请求量很大&#xff0c;就会对后端系统造成很大的压力。这就叫做缓存穿透…

python(15)-window7配置iPython

前提&#xff1a;安装了Pythonanaconda anaconda安装参考&#xff1a;https://www.zhihu.com/question/58033789 在window系统下可以使用两种方法来实现类似与于Linux终端命令运行程序的方法&#xff08;推荐方式2&#xff09;: 1.cmd:自己没有操作过&#xff0c;可以参考下面…