激活函数和全连接层——基于Pytorch
1、激活函数
1.1、什么是激活函数?
神经网络中的每个神经元接受上一层的输出值作为本神经元的输入值,并将处理结果传递给下一层(隐藏层或输出层)。在多层神经网络中,上层的输出和下层的输入之间具有一个函数关系,这个函数称为激活函数。
我们先来看一个简单的神经网络,如下图:
它由一个输入层,一个隐藏层和一个输出层组成。隐藏层含3个神经元,其中一个神经元内部结构如下图:
1.2、为什么需要激活函数?
如果不用激活函数,每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,那么网络的逼近能力就相当有限。
就如上图的神经网络,如果没有激活函数,那么:
Output=w7(input1∗w1+input2∗w2)+w8(input1∗w3+input2∗w4)+w9(input1∗w5+input2∗w6)Output = w7(input1*w1+input2*w2)+w8(input1*w3+input2*w4)+w9(input1*w5+input2*w6)Output=w7(input1∗w1+input2∗w2)+w8(input1∗w3+input2∗w4)+w9(input1∗w5+input2∗w6)
调整一下:
Output=input1(w1∗w7+w3∗w8+w9∗w5)+input2∗(w2∗w7+w4∗w8+w6∗w9)Output = input1(w1*w7+w3*w8+w9*w5)+input2*(w2*w7+w4*w8+w6*w9)Output=input1(w1∗w7+w3∗w8+w9∗w5)+input2∗(w2∗w7+w4∗w8+w6∗w9)
相当于Y=W∗XY=W*XY=W∗X的线性模式。可以解决普通的线性二分类问题,但无法解决非线性问题,而激活函数就是将线性神经网络转成非线性的。
1.3、几种常用激活函数
sigmod函数
f(x)=11+e−xf(x) = \frac{1}{1+e^{-x}}f(x)=1+e−x1
它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。sigmod函数曾经很流行,但因为固有的一些缺点,近年来用它的人越来越少。
缺点:
(1)如果我们初始化神经网络的权值为 [0,1][0,1][0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞)(1,+∞)(1,+∞)区间内的值,则会出现梯度爆炸情况。
(2)函数输出不是以0为中心的,这样会使权重更新效率降低。
(3)sigmod函数要进行指数运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。tanh函数
tanh(x)=ex−e−xex+e−xtanh(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}tanh(x)=ex+e−xex−e−x
tanh是双曲正切函数,和sigmod函数的曲线是比较相近的。相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。不过这些也都不是一成不变的,还是要具体问题具体分析。Relu函数
Relu=max(0,x)Relu = max(0,x)Relu=max(0,x)
ReLU函数(Rectified Linear Unit)其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient。ReLU函数是目前比较火的一个激活函数,相比于sigmod函数和tanh函数,它有以下几个优点:
(1)在输入为正数的时候,解决了梯度消失问题。
(2)计算速度要快很多。ReLU函数只有线性关系,比sigmod和tanh要快很多。
(3)收敛速度远快于sigmoid和tanh。
缺点:
(1)当输入是负数的时候,ReLU是完全不被激活的。
(2)ReLU函数的输出要么是0,要么是正数,这也就是说,ReLU函数也不是以0为中心的函数。
尽管存在这两个问题,ReLU目前仍是最常用的激活函数,在搭建人工神经网络的时候推荐优先尝试
ELU函数
f(x)={x,x>0a(ex−1),x≤0f(x) = \begin{cases} x, & \text{x>0} \\ a(e^x-1), & \text{x≤0} \end{cases} f(x)={x,a(ex−1),x>0x≤0
ELU函数是针对ReLU函数的改进,相比于ReLU,在输入为负数的情况下,是有输出的。不过还是有梯度饱和和指数运算的问题,在实际使用中并没有证据证明ELU总是优于ReLU。PReLU函数
f(x)=max(ax,x)f(x)=max(ax,x) f(x)=max(ax,x)
通常α=0.01α=0.01α=0.01。在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。但是在实际操作当中,并没有完全证明PReLU总是好于ReLU,还是要具体问题具体分析。
1.4、PyTorch激活函数(ReLU)
import torch
import torch.nn as nnm = nn.ReLU(inplace=True)#inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出
input = torch.randn(7)print(input) #tensor([1.4940, 1.0278,-1.9883,-0.1871, 0.4612, 0.0297, 2.4300])
output = m(input)
print(input) #tensor([1.4940, 1.0278, 0.0000, 0.0000, 0.4612, 0.0297, 2.4300])
2、全连接层
2.1、什么是全连接层
全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用,就是将数据映射到样本标记空间。
这是一个简单的CNN结构,一个卷积层,一个池化层,最后两列小圆球是两个全连接层。全连接层是怎么得到的呢?在实际使用中,全连接层可理解为卷积操作:
上图的池化层输出了20个12×12的图像(虽然画的是3x3的,但你假设是12x12的嘛),然后用20个12x12的filter去卷积池化层的输出,得到的结果就是一个全连接层的一个神经元的输出,这个输出就是一个值。因为我们有100个神经元,所以得用一个100x20x12x12的卷积层去卷积池化层的输出。
如果前层是卷积层或池化层的全连接层可以转化为卷积核为h×wh×wh×w的全局卷积(hhh和www分别为前层卷积结果的高和宽),如果前层是全连接的全连接层可以转化为卷积核为1x1的卷积。
但是全连接的参数实在是太多了,这张图里就有100x20x12x12个参数,所以现在的趋势是尽量避免全连接,目前主流的一个方法是全局平均值。
2.2、全连接层的作用
全连接层中的每个神经元与其前一层的所有神经元进行全连接,整合卷积层或者池化层中具有类别区分性的局部信息,这样就能把一张图高度浓缩成一个数了,可以大大减少特征位置对分类带来的影响。
举个栗子:
上图可以看出,目标在不同的位置,但是输出的值相同。全连接层filter的作用就相当于找到目标,把feature map整合成一个值,这个值大就有目标,值小就没有目标。
2.3、PyTorch全连接层(nn.Linear)
class torch.nn.Linear(in_features,out_features,bias = True )
参数:
in_features - 每个输入样本的大小
out_features - 每个输出样本的大小
bias - 如果设置为False,则图层不会学习附加偏差。默认值:True
import torchx = torch.randn(128, 20) # 输入维度[128,20]
m = torch.nn.Linear(20, 30)
output = m(x)print('m.weight.shape:\n ', m.weight.shape)#torch.Size([30, 20])
print('m.bias.shape:\n', m.bias.shape)#torch.Size([30])
print('output.shape:\n', output.shape)#torch.Size([128, 30])
激活函数和全连接层——基于Pytorch相关推荐
- 深度学习笔记(一):卷积层+池化层+激活函数+全连接层
写在前面:大家好!我是[AI 菌],一枚爱弹吉他的程序员.我热爱AI.热爱分享.热爱开源! 这博客是我对学习的一点总结与记录.如果您也对 深度学习.机器视觉.算法.Python.C++ 感兴趣,可以关 ...
- 深度之眼Pytorch打卡(十三):Pytorch全连接神经网络部件——线性层、非线性激活层与Dropout层(即全连接层、常用激活函数与失活 )
前言 无论是做分类还是做回归,都主要包括数据.模型.损失函数和优化器四个部分.数据部分在上一篇笔记中已经基本完结,从这篇笔记开始,将学习深度学习模型.全连接网络MLP是最简单.最好理解的神经网络, ...
- 基于pytorch开发CNN提取全连接层作为特征
场景:利用CNN网络的全连接层作为图像的特征. 代码: import sys import os import math import random import heapq import time ...
- pytorch实现IMDB数据集情感分类(全连接层的网络、LSTM)
目录 一.任务描述 二.思路分析 三.准备数据集 3.1 基础dataset的准备 3.2 文本序列化 四.构建模型 4.1 仅有全连接层 4.2 LSTM 4.3 训练和测试 五.完整代码 5.1 ...
- 8月2日Pytorch笔记——梯度、全连接层、GPU加速、Visdom
文章目录 前言 一.常见函数的梯度 二.激活函数及其梯度 1.Sigmoid 2.Tanh 3.ReLU 三.Loss 函数及其梯度 1.Mean Squared Error(MSE) 2.Softm ...
- Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...
- 【深度学习】(3) 全连接层、激活函数
各位同学好,今天和大家分享一下tensorflow2.0深度学习中的相关操作.内容有: (1) 全连接层创建: tf.keras.Sequential(),tf.keras.layers.Dense( ...
- pytorch神经网络之卷积层与全连接层参数的设置
当使用pytorch写网络结构的时候,本人发现在卷积层与第一个全连接层的全连接层的input_features不知道该写多少?一开始本人的做法是对着pytorch官网的公式推,但是总是算错. 后来发现 ...
- 卷积神经网络CNN要点:CNN结构、采样层、全连接层、Zero-padding、激活函数及Dropout
CNN结构: 卷积层:特征提取: 采样层:特征选择: 全连接层:根据特征进行分类. 采样层(pooling): max-pooling:克服卷积层权值参数误差: average-pooling:克服卷 ...
最新文章
- 问题八十八:Fibonacci数非递归解
- 跟随我在oracle学习php(21)
- html dom 替换节点,替换 从javascript dom文本节点
- windows系统如何进入环境变量
- ORACLE与PostgreSql的区别
- matlab 变量和数组中,求助:如何将带有符号变量的运算结果储存到数组中
- 一个百分号%引起的事故
- 测试手机屏幕颜色软件,【AVW分享】一款你可以拥有的手机屏幕测试app
- 富士通Fujitsu LPK-888T 打印机驱动
- 设计模式-外观模式(家庭影院你值得拥有)
- 16. FizzBuzz
- 单片机 STM32 HAL 步进电机 Motor
- 头同尾合十的算法_头同尾合十的计算规律
- 不要看《深入浅出MFC》!
- conflicting(conflicting)
- 微信小程序“网络出错,轻触屏幕重新加载” -1202
- 【Golang之路】——slice总结
- 基于晶体结构算法的函数寻优算法
- USB 3.0协议理解
- [L4D]Tickrate Enabler 服务器速率配置方法