任务描述
掌握 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公式进行转换,公式如下所示:
维度:
- 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公式进行转换,公式如下所示:
维度:
- 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
- torch.nn.Softplus(beta=1, threshold=20)
- beta - Softplus公式的 beta值.默认值:1
- 阈值 - 高于此值的值恢复为线性函数。默认值:20
- torch.nn.Softsign
编程要求
本关涉及的代码文件为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 *********/