PyTorch基础教程(七)torch.nn 模块(3)

目录

一、激活函数

二、循环层

三、全连接层


一、激活函数

        在 PyTorch 中,提供了十几种激活函数层所对应的类,但常用的激活函数通常为 S型Sigmoid)激活函数、双曲正切Tanh)激活函数、线性修正单元ReLU)激活函数等。

表 1-1 PyTorch 中常用的激活函数操作
层对应的类功能
torch.nn.SigmoidSigmoid激活函数
torch.nn.TanhTanh激活函数
torch.nn.ReLUReLU激活函数
torch.nn.SoftplusSoftplus激活函数

 ① torch.nn.Sigmoid ( ) 对应的 Sigmoid激活函数 ,也叫 logistic激活函数,计算公式为:

f (x) = \frac{1}{1+e_{}^{-x}}

        其输出是在(0,1)这个开区间内。该函数在神经网络早期也是很常用的激活函数之一,但是当输入远离坐标原点时,函数的梯度就变得很小,几乎为零,所以会影响参数的更新速度。

torch.nn.Tanh ( ) 对应的双曲正切函数,计算公式为:

f (x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}

        其输出区间是在(-1,1)之间,整个函数是以0为中心,虽然 Tanh 函数曲线和 Sigmoid 函数的曲线形状比较相近,在输入很大或很小时,梯度很小,不利于权重更新,但由于 Tanh 的取值输出以0对称,使用的效果会比 Sigmoid 好很多。

 torch.nn.ReLU ( ) 对应的 ReLU函数 又叫修正线性单元,计算方式为:

f (x) = max(0,x)

        ReLU 函数只保留大于0的输出,其他输出则会设置为 0 。在输入正数的时候,不存在梯度饱和的问题。计算速度相对于其他类型激活函数要快很多,而且 ReLU 函数只有线性关系,所以不管是前向传播还是反向传播,速度都很快。

 torch.nn.Softplus ( ) 对应的平滑近似 ReLU的激活函数,其计算公式为:

f(x) = \frac{1}{\beta }log(1+e^{\beta x })

        \beta默认取值为1。该函数对任意位置都可计算导数,而且尽可能地保留了 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 所示。

表 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 每层的计算公式为:

h_{t} = tanh(W_{ih}x_{t} + b_{ih} + W_{hh}x_{t-1} + b_{hh})

        h_{t} 是时刻 t 的隐状态x_{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 。如果是双向 RNNnum_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 ) 的张量。

        全连接层的应用范围非常广泛,只有全连接层组成的网络是全连接神经网络,可用于数据的分类或回归预测卷积神经网络循环神经网络末端,通常会由多个全连接层组成。
 

最新动态,请关注微信公众号回不去的明天 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗狼-回不去的明天

您的支持是对创作的最大鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值