单层感知机

最简单的神经网络单元,感知机模拟生物神经元而来,有输入、输出,信号从输入流向输出。

每一个感知机都有一个输入

,一个输出
,和三个参数构成,它们分别是:
  • 权重(weight)

  • 偏置(bias)
  • 激活函数(activation function)

可以这么说权重和偏差是从数据中学习的,激活函数是根据网络设计者对网络及其目标输出的直觉而精心选择的。

数学上可以表示为:

一般而言,输入可能很多,我们可以用矩阵来表示这种情况,

是向量,乘积为点积

激活函数是一个非线性函数,本质上,感知器是线性和非线性函数的组合。

下面我们使用pytorch(1.01)实现一个简单的感知机:

import torch
import torch.nn as nn#单层感知机,数学形式为y=f(w*x+b),w称为权重,b称为偏置,f称为激活函数(activation function),
# 其中,x和w是向量,两参数为点积形式.
class Perceptron(nn.Module):#一个单层感知机,只有一个线性层def __init__(self,input_dim):# input_dim:输入特征的大小super(Perceptron,self).__init__()self.fc1=nn.Linear(input_dim,1)def forward(self, x_in):#感知机的前向传递#x_in(torch.Tensor):输入的数据张量,符合(batch, num_features)#Returns:结果张量,符合(batch,).return torch.sigmoid(self.fc1(x_in)).squeeze_()

激活函数介绍

Sigmoid

Sigmoid是神经网络历史上最早使用的激活函数之一。它接受任何实际值,并将其压缩到0到1之间的范围内。其数学表达式为:

Pytorch代码如下:

import torch
import matplotlib.pyplot as plt
x=torch.range(-5.,5.,0.1)
y=torch.sigmoid(x)
plt.plot(x.numpy(),y.numpy())
plt.title("Sigmoid activation")
plt.show()

对于对于大多数输入,Sigmoid函数饱和非常快,这可能导致梯度变为零,或者发散到溢出,这种现象亦称为梯度消失,替补爆炸。因此,我们很少在神经网络中使用Sigmoid单元,除了在输出端使用可以利用其挤压特性解释为概率。

Tanh

Tanh函数类似Sigmoid但是数学形式上存在极大不同。

数学表达式为:

tanh和sigmoid一样,也是一个“挤压”函数,只是它将一组实数值从

映射到范围

Pytorch代码如下:

import torch
import matplotlib.pyplot as plt
x=torch.range(-5.,5.,0.1)
y=torch.tanh(x)
plt.plot(x.numpy(),y.numpy())
plt.title("tanh activation")
plt.show()

ReLu

ReLU(发音为ray-luh)代表整流线性单元。这可以说是最重要的激活函数。它的数学形式为:

ReLU单元所做的只是将负值削波为零。

import torch
import matplotlib.pyplot as plt
import  torch.nn as nn
relu=nn.ReLU()
x=torch.range(-5.,5.,0.1)
y=relu(x)
plt.plot(x.numpy(),y.numpy())
plt.title("ReLu activation")
plt.show()

ReLU的削波效应有助于解决梯度消失问题,但是也带来了一个问题,随着时间的推移,网络中的某些输出可能会变为零,并且永远不会恢复。为了解决这个问题,目前提出了Leaky ReLU(泄露ReLu)和Parametric ReLU (PReLU),其中泄漏系数a是学习的参数。

数学形式为:

Pytorch代码为:

import torch
import matplotlib.pyplot as plt
import  torch.nn as nn
prelu=nn.PReLU(num_parameters=1)
x=torch.range(-5.,5.,0.1)
y=prelu(x)
plt.plot(x.detach().numpy(),y.detach().numpy())
plt.title("PReLU activation")
plt.show()

SoftMax

SoftMax函数将每个单元的输出压缩到0到1之间,SoftMax操作还将每个输出除以所有输出的总和,从而得出k个可能类别的离散概率分布:

结果概率加起来都是1。这对于解释分类任务的输出非常有用,因此这种转换通常与概率训练目标配对,例如分类交叉熵。

Pytorch代码如下:

import torch
import  torch.nn as nn
softmax=nn.Softmax(dim=1)
x=torch.rand(1,3)
y=softmax(x)print(x)
print(y)
print(torch.sum(y,dim=1))# tensor([[0.2850, 0.5766, 0.5145]])
# tensor([[0.2781, 0.3722, 0.3498]])
# tensor([1.])

损失函数

MSELoss() 均方差损失函数

对于网络输出

和目标
是连续值的回归问题,一个常见的损失函数是均方误差(MSE),均方误差只是预测值和目标值之间差值的平方的平均值。

Pytorch代码:

import torch
import  torch.nn as nnmse_loss=nn.MSELoss()
outputs=torch.randn(3,5,requires_grad=True)
targets=torch.randn(3,5)
loss=mse_loss(outputs,targets)
print( loss )# tensor(1.1535, grad_fn=<MseLossBackward>)

CrossEntropyLoss() 分类交叉熵损失函数

Categorical Cross-Entropy Loss,分类交叉熵损失函数,分类交叉熵损失通常用于多类分类设置,其中输出被解释为类成员概率的预测。

其中目标

是一个由n个元素组成的向量,代表着在所有类的概率分布,当,只有一种类是正确的话,这个向量将会变成One-hot向量。

网络的输出

也是n个元素的向量,但代表网络对多项式分布的预测。分类交叉熵将比较这两个向量
来测量损失。

Pytorch代码如下:

import torch
import torch.nn as nnce_loss=nn.CrossEntropyLoss()
outputs=torch.randn(3,5,requires_grad=True)
targets=torch.tensor([1,0,3],dtype=torch.int64)
loss=ce_loss(outputs,targets)
print(loss)#tensor(1.1253, grad_fn=<NllLossBackward>)

BCELoss() 二元交叉熵损失函数

在我们有多个类的分类问题时候,分类交叉熵损失函数非常有用。但是有时,我们的任务仅仅包括区分两个类别——也称为二元分类。对于这种情况,使用二元交叉熵损失是有效的。

Pytorch代码:

import torch
import torch.nn as nnbce_loss=nn.BCELoss()
probabilities=torch.sigmoid(torch.randn(4,1,requires_grad=True))
targets=torch.tensor([1,0,1,0],dtype=torch.float32).view(4,1)
loss=bce_loss(probabilities,targets)
print(loss)#tensor(1.6178, grad_fn=<BinaryCrossEntropyBackward>)

由此第一节我们便介绍到这里。

randn函数加噪声_NLP入门指南01:感知机、激活函数、损失函数相关推荐

  1. randn函数加噪声_语义分割中常用的损失函数1(基础篇)

    一.L1.L2 loss (分割中不常用,主要用于回归问题) L1 Loss L1 Loss 主要用来计算 input x 和 target y 的逐元素间差值的平均绝对值. pytorch表示为: ...

  2. randn函数加噪声_numpy给图片加高斯噪声

    给加高斯噪声的意思,就是在原图像矩阵上面加一个符合高斯或者叫正态分布特征的矩阵. 生成随机噪声的三个方法,如果我们的目标矩阵是一个r*c的矩阵,要生成一个均值是mean,标准差sigma的随机噪声矩阵 ...

  3. randn函数加噪声_损失函数 (Loss Function)

    损失函数 MSELoss(均方误差损失函数) BCELoss.BCEWithLogitsLoss CrossEntropyLoss L1Loss SmoothL1Loss 各个损失函数的导数 计算值: ...

  4. matlab中给信号添加高斯白噪声的两种方法,awgn计算过程,randn函数

    y=awgn(x,snr,px_dBW) 给信号x添加噪声功率为某个值的高斯白噪声. snr为信噪比,单位dB. px_dBW为信号x的指定功率(注意,是指定功率,而不是x本身的功率),单位dBW. ...

  5. jQuery中文入门指南,翻译加实例,jQuery的起点教程

    中文版译者:Keel 此文以实例为基础一步步说明了jQuery的工作方式.现以中文翻译(添加我的补充说明)如下.如有相关意见或建议请 EMAIL 告知.或者在 BLOG中留言. 英文原版:http:/ ...

  6. matlab给图像加噪声比较实用的方法---函数imnoise介绍

    近期写论文的时候要用到给图像加噪声,就在网上百度了一下,发现其中的一篇博客写的很好,就转载过来了,这里我主要转载了博主的第三部分imnoise函数.如果需要更详细的内容,请到原博主博客浏览.希望对大家 ...

  7. Spark快速入门指南 – Spark安装与基础使用

    本文转载自Spark快速入门指南 – Spark安装与基础使用 Apache Spark 是一个新兴的大数据处理通用引擎,提供了分布式的内存抽象.Spark 正如其名,最大的特点就是快(Lightni ...

  8. 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

    目录 硬知识 DS18B20介绍 时序 初始化时序 写时序 读时序 命令 ROM 操作命令 ROM 搜索举例 存贮器操作命令 示例程序 DS18B20.c DS18B20.h 测试程序 定时器中断服务 ...

  9. 【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计

    目录 硬知识 简介 操作模式 HMC5883L 连续测量模式 单次测量模式 闲置模式 QMC5883L 连续测量模式 待命模式 主要差异 寄存器 寄存器列表 HMC5883L QMC5883L 配置寄 ...

最新文章

  1. jsp常见获取地址函数之间的不同
  2. 号召一下,看有多少人能响应!
  3. python学习软件-python软件学习从入门到精通
  4. Django model进阶
  5. 【Matlab】parfor并行运算如何显示进度条?
  6. 《嵌入式C编程:PIC单片机和C编程技术与应用》一1.2 注释
  7. markdown 链接跳转到标题_我是如何使用 Vim 高效率写 Markdown 的
  8. Flex读取XML不刷新问题
  9. pandas的自带数据集_pandas.DataFrame.sample随机抽样
  10. Flutter 底部向上弹出的动画按钮
  11. 解决sodu echo写入文件是权限不足-bash: test.txt: Permission denied
  12. 不要为了“分库分表”而“分库分表”
  13. Daily scrum[2013.12.02]
  14. 荣耀手机安装谷歌框架_华为荣耀9青春版安装谷歌框架 无需Root 华为荣耀手机安装谷歌框架...
  15. 安装kubernetes k8s v1.16.0 国内环境
  16. html给表格添加标题栏,word表格怎么添加标题栏 如何在word表格上方加标题
  17. (一)软件测试的目的和定义
  18. 计算机组成原理实验报告一静态随机存储器
  19. 天地融2014校园招聘笔试题
  20. App测试流程及测试点(个人整理版)-转

热门文章

  1. keepalived 服务器内存持续升高问题
  2. java实现mysql的主从切换(第二部分)
  3. Shadow Brokers扬言兜售新漏洞攻击工具
  4. H3 BPM MVC表单SheetOffice控件使用分享
  5. outlook恢复已删除邮件
  6. CentOS 6.3安装Nginx开启目录浏览、下载功能
  7. PHP数组传递给JavaScript以及json_encode的gbk中文乱码的解决
  8. httpclient 小例子编写
  9. 网页元素坐标表示及坐标计算方法
  10. 详解 ASP.NET异步