PyTorch 激励函数

非线性方程

在这里插入图片描述
在这里插入图片描述
把整个网络简化成这样一个式子. Y = Wx, W 就是我们要求的参数, y 是预测值, x 是输入值. 用这个式子, 我们很容易就能描述刚刚的那个线性问题, 因为 W 求出来可以是一个固定的数. 不过这似乎并不能让这条直线变得扭起来 , 激励函数作用可以掰弯它

激励函数

在这里插入图片描述
AF 就是指的激励函数.
AF其实就是另外一个非线性函数. 比如说relu, sigmoid, tanh. 将这些掰弯利器嵌套在原有的结果之上, 强行把原有的线性结果给扭曲了. 使得输出结果 y 也有了非线性的特征. 举个例子, 比如我使用了 relu 这个掰弯利器, 如果此时 Wx 的结果是1, y 还将是1, 不过 Wx 为-1的时候, y 不再是-1, 而会是0.

可以创造自己的激励函数来处理自己的问题, 不过要确保的是这些激励函数必须是可以微分的, 因为在 backpropagation 误差反向传递的时候, 只有这些可微分的激励函数才能把误差传递回去.

常用选择

在这里插入图片描述
恰当使用这些激励函数, 比如当你的神经网络层只有两三层, 不是很多的时候, 对于隐藏层, 使用任意的激励函数, 随便掰弯是可以的, 不会有特别大的影响. 不过, 当你使用特别多层的神经网络, 在掰弯的时候, 不得随意选择利器. 因为这会涉及到梯度爆炸, 梯度消失的问题。

在具体的例子中, 我们默认首选的激励函数是哪些. 在少量层结构中, 我们可以尝试很多种不同的激励函数. 在卷积神经网络 CNN的卷积层中, 推荐的激励函数是 relu. 在循环神经网络中 recurrent neural networks, 推荐的是 tanh 或者是 relu

Torch 中的激励函数

平时要用到的就这几个. relu, sigmoid, tanh, softplus.

import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pylab as plt

#fake data
x=torch.linspace(-5,5,200)#从-5到5分成200个点线段数据
x=Variable(x)
x_np=x.data.numpy()#torch用matplotlib无法识别

# 几种常用的 激励函数
y_relu = F.relu(x).data.numpy()
y_sigmoid = F.sigmoid(x).data.numpy()
y_tanh = F.tanh(x).data.numpy()
y_softplus = F.softplus(x).data.numpy()


plt.figure(1, figsize=(8, 6))
#num:图像编号或名称,数字为编号 ,字符串为名称
#figsize:指定figure的宽和高,单位为英寸;
plt.subplot(221) # 第一行的左图
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim((-1, 5))
#设置y轴的数值显示范围。
plt.legend(loc='best')
#设置图例

plt.subplot(222)
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')

plt.subplot(223)
plt.plot(x_np, y_tanh, c='red', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')

plt.subplot(224)
plt.plot(x_np, y_softplus, c='red', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')

plt.show()

在这里插入图片描述

发布了20 篇原创文章 · 获赞 16 · 访问量 1738

猜你喜欢

转载自blog.csdn.net/komorebi6/article/details/104233347