Pytorch 之torch.nn初探 非线性--Nonlinearities

任务描述

掌握 torch.nn 提供的几个重要的非线性模型,如下所示。由此对数据进行相应的非线性映射,便于之后的处理和应用。

  • ReLU
  • Threshold
  • Sigmoid
  • Tanh

本关任务:

本关提供了一个 Variable 类型的变量input,利用tanh模型对数据进行非线性映射。

相关知识

在编程中,我们常常需要对满足不同条件的数据进行不同的处理,这里我们可以利用非线性模型对数据进行映射以满足要求。

ReLU()

基本形式:

torch.nn.ReLU (inplace=False)

用途:应用 ReLU公式对输入数据进行转换: ReLU (x)=max(0,x)

参数说明:

  • inplace
  • 可以选择性地在原式进行操作
  • 默认值为 False

维度:

  • Input: (N,∗) - *代表任意数目的维度
  • Output: (N,∗)(N,∗)- 与输入维度相同

应用示例:

m = nn.ReLU()
input = Variable(torch.randn(2))
print(input)
print(m(input))

可以看到input中的两个元素一个为正值大于0,一个为负值小于0。ReLU 函数应用在该输入的效果如下所示:

输出结果:

#input
Variable containing:
-0.1006
 2.0656
[torch.FloatTensor of size 2]

#nn.ReLU(input)
Variable containing:
 0.0000
 2.0656
[torch.FloatTensor of size 2]

Threshold()

基本形式:

torch.nn.Threshold (threshold, value, inplace=False)

用途:对输入张量的每个元素进行阈值判断。阈值定义如下:

y =  x        if x >  threshold
     value    if x <= threshold

参数说明:

  • threshold – 阈值
  • value – 当输入小于阈值时用以替换的值
  • inplace
  • 可以选择性地在原式进行操作
  • 默认值为 False

维度:

  • Input: (N,∗) - *代表任意数目的维度
  • Output: (N,∗)(N,∗)- 与输入维度相同

应用示例:

m = nn.Threshold(0.1, 20)
input = Variable(torch.randn(2))
print(input)
print(m(input))

由下式的输出结果可以看出,input 的第一个元素小于阈值0.1,被公式替换为value值即20。

输出结果:

#inputVariable containing:-0.9293 1.1499[torch.FloatTensor of size 2]

#nn.Threshold(input)Variable containing: 20.0000 1.1499[torch.FloatTensor of size 2]

Sigmoid()

基本形式:

torch.nn.Sigmoid ()

用途:应用 Sigmoid公式进行转换,公式如下所示:

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

维度:

  • Input: (N,∗) - *代表任意数目的维度
  • Output: (N,∗)(N,∗)- 与输入维度相同

Sigmoid是我们在进行神经网络训练中经常会看到的一个函数,也叫 Logistic 函数,它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。

他的图形如下所示:

由上图可以看到,该图形的值域为 `(0,1)`,它常被用于神经元(neuron)内部所代表的激励函数(activation)。

应用示例:

m = nn.Sigmoid()
input = autograd.Variable(torch.randn(2))
print(input)
print(m(input))

输出结果:

#inputVariable containing:-1.2118-0.6524[torch.FloatTensor of size 2]

#nn.Sigmoid(input)Variable containing: 0.22940.3424[torch.FloatTensor of size 2]

Tanh()

基本形式:

torch.nn.Tanh ()

用途:应用Tanh公式进行转换,公式如下所示:

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

维度:

  • Input: (N,∗) - *代表任意数目的维度
  • Output: (N,∗)(N,∗)- 与输入维度相同

Tanh函数也是一个典型的 S 型函数,称为双切正切函数。

取值范围为`[-1,1]`。 tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。

与 sigmoid 的区别是, tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。两者之间的关系如下所示:

tanh(x)=2sigmoid(2x)−1 ####其他非线性函数

  • torch.nn.Hardtanh(min_val=-1, max_val=1, inplace=False)
  • min_val - 线性区域范围的最小值。默认值:-1
  • max_val - 线性区域范围的最大值。默认值:1
  • inplace - 可以选择性地进行就地操作。默认值:False ```python

具体定义如下:

  • f(x) = +1 , if x > 1
  • 1, if x < -1 x, otherwise ```
  • nn.LogSigmoid

LogSigmoid(x)=log(\frac{1}{1+e^{-x}})

  • torch.nn.Softplus(beta=1, threshold=20)
  • beta - Softplus公式的 beta值.默认值:1
  • 阈值 - 高于此值的值恢复为线性函数。默认值:20

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

  • torch.nn.Softsign

f(x)=\frac{x}{1+|x|}

编程要求

本关涉及的代码文件为nonlinear.py,本次的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:

  • 创建 Tanh 模型 m;
  • 输出经m变化后的input值。
  • 具体请参见后续测试样例。
测试说明

测试过程:

  • 本关涉及的测试文件为nonlinear.py,运行用户填写后的程序判断正误。
  • 测试程序将检测两个方面:是否包含特定的代码行以及程序的输出是否正确,若两个方面均正确则输出下面的预期输出,否则报错。
  • 请注意输出格式及规范。
  • 注意,在声明变量时请按照提示命名,否则将会报错。

以下是测试样例:

测试输入: 预期输出:

Variable containing: 0.9801-0.8854 0.4930[torch.FloatTensor of size (3,)]

Congratulation!

代码实战

import torch
import torch.nn as nn
from torch.autograd import Variable

input = Variable(torch.Tensor([2.3,-1.4,0.54]))

#/********** Begin *********/
#创建 Tanh 模型 m
m=nn.Tanh()
#输出经 m 变化后的 input 值
print(m(input))
#/********** End *********/
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十有久诚

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值