赞
踩
目录
在 PyTorch 中,提供了十几种激活函数层所对应的类,但常用的激活函数通常为 S型(Sigmoid)激活函数、双曲正切(Tanh)激活函数、线性修正单元(ReLU)激活函数等。
层对应的类 | 功能 |
---|---|
torch.nn.Sigmoid | Sigmoid激活函数 |
torch.nn.Tanh | Tanh激活函数 |
torch.nn.ReLU | ReLU激活函数 |
torch.nn.Softplus | Softplus激活函数 |
① torch.nn.Sigmoid ( ) 对应的 Sigmoid激活函数 ,也叫 logistic激活函数,计算公式为:
其输出是在(0,1)这个开区间内。该函数在神经网络早期也是很常用的激活函数之一,但是当输入远离坐标原点时,函数的梯度就变得很小,几乎为零,所以会影响参数的更新速度。
② torch.nn.Tanh ( ) 对应的双曲正切函数,计算公式为:
其输出区间是在(-1,1)之间,整个函数是以0为中心,虽然 Tanh 函数曲线和 Sigmoid 函数的曲线形状比较相近,在输入很大或很小时,梯度很小,不利于权重更新,但由于 Tanh 的取值输出以0对称,使用的效果会比 Sigmoid 好很多。
③ torch.nn.ReLU ( ) 对应的 ReLU函数 又叫修正线性单元,计算方式为:
ReLU 函数只保留大于0的输出,其他输出则会设置为 0 。在输入正数的时候,不存在梯度饱和的问题。计算速度相对于其他类型激活函数要快很多,而且 ReLU 函数只有线性关系,所以不管是前向传播还是反向传播,速度都很快。
④ torch.nn.Softplus ( ) 对应的平滑近似 ReLU的激活函数,其计算公式为:
以下使用 PyTorch 中的激活函数可视化上面介绍的几种激活函数的图像,程序如下所示:
- import torch
- import torch.nn as nn
- import matplotlib.pyplot as plt
-
- x = torch.linspace(-6,6,100)
-
- sigmoid = nn.Sigmoid() #Sigmoid激活函数
- ysigmoid = sigmoid(x)
-
- tanh = nn.Tanh() #Tanh激活函数
- ytanh = tanh(x)
-
- relu = nn.ReLU() #ReLU激活函数
- yrelu = relu(x)
-
- softplus = nn.Softplus() #Softplus激活函数
- ysoftplus = softplus(x)
-
- plt.figure(figsize=(14,3)) #可视化激活函数
-
- plt.subplot(1,4,1)
- plt.plot(x.data.numpy(), ysigmoid.data.numpy(),"r-")
- plt.title('sigmoid')
- plt.grid()
-
- plt.subplot(1,4,2)
- plt.plot(x.data.numpy(), ytanh.data.numpy(),"r-")
- plt.title('Tanh')
- plt.grid()
-
- plt.subplot(1,4,3)
- plt.plot(x.data.numpy(), yrelu.data.numpy(),"r-")
- plt.title('ReLU')
- plt.grid()
-
- plt.subplot(1,4,4)
- plt.plot(x.data.numpy(), ysoftplus.data.numpy(),"r-")
- plt.title('Softplus')
- plt.grid()
图 1-1 激活函数的图像
在 PyTorch 中,提供了三种循环层,如 表2-1 所示。
层对应的类 | 功能 |
---|---|
torch.nn.RNN ( ) | 多层 RNN 单元 |
torch.nn.LSTM ( ) | 多层长短期记忆 LSTM 单元 |
torch.nn.GRU ( ) | 多层门限循环 GRU 单元 |
torch.nn.RNNCell ( ) | 一个 RNN 循环层单元 |
torch.nn.LSTMCell ( ) | 一个长短期记忆 LSTM 单元 |
torch.nn.GRUCell ( ) | 一个门限循环 GRU 单元 |
下面以 torch.nn.RNN ( ) 输入一个多层的 Elman RNN 进行学习,激活函数可以使用 tanh 或者 ReLU。对于输入序列中的每个元素,RNN 每层的计算公式为:
是时刻 t 的隐状态。 是上一层时刻 t 的隐状态,或者是第一层在时刻 t 的输入。若 nonlinearity = relu,则使用 ReLU 函数代替 tanh 函数作为激活函数。
下面以 torch.nn.RNN ( ) 为例,介绍循环层的参数、输入和输出:
参数说明如下:
input_size : 输入 x 的特征数量。
hidden_size : 隐层的特征数量。
num_layers : RNN网络 的层数。
nonlinearity : 指定非线性函数使用 tanh 还是 relu ,默认是 tanh。
bias :如果是 False,那么 RNN层 就不会使用偏置权重,默认是 True 。
batch_first :如果是 True,那么输入和输出的 shape 应该是[batch_size,time_step,feature]。
dropout : 如果值非零,那么除了最后一层外,其他 RNN层 的输出都会套上一个 dropout层 ,默认为 0 。
bidirectional : 如果是 True ,将会变成一个 双向RNN ,默认是 False 。
RNN 的输入为 input 和 h_0 ,其中 input 是一个形状为 (seq_len,batch,input_size) 的张量。 h_0 则是一个形状为 (num_layers × num_directions,batch,hidden_size) 保存着初始隐状态的张量。如果不提供就默认为 0 。如果是双向 RNN ,num_directions 等于 2 ,否则等于 1 。
RNN 的输出为 output 和 h_n ,其中:
output 是一个形状为 (seq_len,batch,hidden_size × num_directions) 的张量,保存着 RNN 最后一层的输出特征。如果输入是被填充过的序列,那么输出也是被填充过的序列。
h_n 是一个形状为 (num_layers × num_directions,batch,hidden_size) 的张量,保存着最后一个时刻的隐状态。
在后面的循环神经网络内容中会以具体的实例,介绍循环神经网络的建立和应用。
通常所说的全连接层是指一个由多个神经元所组成的层,其所有的输出和该层的所有输入都有连接,即每个输入都会影响所有神经元的输出。在 PyTorch 中的 nn.Linear ( ) 表示线性变换,全连接层可以看做是 nn.Linear ( ) 表示线性变层再加上一个激活函数层所构成的结构。
nn.Linear ( ) 全连接操作及相关参数如下:
torch.nn.Linear (in_features,out_features,bias = True)
参数说明如下:
in_features : 每个输入样本的特征数量。
out_features : 每个输出样本的特征数量。
bias :若设置为 False ,则该层不会学习偏置。默认值为 True 。
torch.nn.Linear ( ) 的输入为 (N,in_features) 的张量,输出为 (N,out_features ) 的张量。
全连接层的应用范围非常广泛,只有全连接层组成的网络是全连接神经网络,可用于数据的分类或回归预测,卷积神经网络和循环神经网络的末端,通常会由多个全连接层组成。
最新动态,请关注微信公众号:回不去的明天
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。