4.1.2 激活函数

PyTorch实现了常见的激活函数,其具体的接口信息可参见官方文档1,这些激活函数可作为独立的layer使用。这里将介绍最常用的激活函数ReLU,其数学表达式为:

代码:

relu = nn.ReLU(inplace=True)
input = t.randn(2, 3)
print(input)
output = relu(input)
print(output) # 小于0的都被截断为0
# 等价于input.clamp(min=0)

结果:

tensor([[ 1.2836,  2.0970, -0.0456],
        [ 1.5909, -1.3795,  0.5264]])
tensor([[ 1.2836,  2.0970,  0.0000],
        [ 1.5909,  0.0000,  0.5264]])

ReLU函数有个inplace参数,如果设为True,它会把输出直接覆盖到输入中,这样可以节省内存/显存。之所以可以覆盖是因为在计算ReLU的反向传播时,只需根据输出就能够推算出反向传播的梯度。但是只有少数的autograd操作支持inplace操作(如tensor.sigmoid_()),除非你明确地知道自己在做什么,否则一般不要使用inplace操作。

在以上的例子中,基本上都是将每一层的输出直接作为下一层的输入,这种网络称为前馈传播网络(feedforward neural network)。对于此类网络如果每次都写复杂的forward函数会有些麻烦,在此就有两种简化方式,ModuleList和Sequential。其中Sequential是一个特殊的module,它包含几个子Module,前向传播时会将输入一层接一层的传递下去。ModuleList也是一个特殊的module,可以包含几个子module,可以像用list一样使用它,但不能直接把输入传给ModuleList。下面举例说明。

代码:


# Sequential的三种写法
net1 = nn.Sequential()
net1.add_module('conv', nn.Conv2d(3, 3, 3))
net1.add_module('batchnorm', nn.BatchNorm2d(3))
net1.add_module('activation_layer', nn.ReLU())net2 = nn.Sequential(nn.Conv2d(3, 3, 3),nn.BatchNorm2d(3),nn.ReLU())from collections import OrderedDict
net3= nn.Sequential(OrderedDict([('conv1', nn.Conv2d(3, 3, 3)),('bn1', nn.BatchNorm2d(3)),('relu1', nn.ReLU())]))
print('net1:', net1)
print('net2:', net2)
print('net3:', net3)

输出:

net1: Sequential(
  (conv): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
  (batchnorm): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (activation_layer): ReLU()
)
net2: Sequential(
  (0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
  (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU()
)
net3: Sequential(
  (conv1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
  (bn1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu1): ReLU()
)

# 可根据名字或序号取出子module,
代码:

# 可根据名字或序号取出子module
net1.conv, net2[0], net3.conv1

输出:
(Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1)),
 Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1)),
 Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1)))

代码:

input = t.rand(1, 3, 4, 4)
output1 = net1(input)
output2 = net2(input)
output3 = net3(input)
output4 = net3.relu1(net1.batchnorm(net1.conv(input)))
print('output1',output1)
print('output2',output2)
print('output3',output3)
print('output4',output4)

结果:

output1 tensor([[[[0.4223, 0.0000],
          [0.0000, 1.4133]],
         [[0.0000, 0.0343],
          [0.8903, 0.7163]],
         [[0.9817, 0.0000],
          [0.7821, 0.0000]]]], grad_fn=<ReluBackward0>)
output2 tensor([[[[0.0000, 0.5348],
          [1.0742, 0.0000]],
         [[1.2695, 0.0000],
          [0.0000, 0.3837]],
         [[0.0000, 0.0000],
          [1.6453, 0.0000]]]], grad_fn=<ReluBackward0>)
output3 tensor([[[[0.1690, 0.7540],
          [0.0000, 0.7581]],
         [[1.6805, 0.0000],
          [0.0000, 0.0000]],
         [[0.2216, 0.5082],
          [0.9433, 0.0000]]]], grad_fn=<ReluBackward0>)
output4 tensor([[[[0.4223, 0.0000],
          [0.0000, 1.4133]],
         [[0.0000, 0.0343],
          [0.8903, 0.7163]],
         [[0.9817, 0.0000],
          [0.7821, 0.0000]]]], grad_fn=<ReluBackward0>)

ModuleList是Module的子类,代码:

modellist = nn.ModuleList([nn.Linear(3,4), nn.ReLU(), nn.Linear(4,2)])
input = t.randn(1, 3)
for model in modellist:input = model(input)
# 下面会报错,因为modellist没有实现forward方法
# output = modelist(input)

Pytorch的RELU函数相关推荐

  1. pytorch拟合sin函数

    pytorch非线性回归调参分享 前期研究过程中获得了一个非常奇怪的函数图像,打算用多层感知机(MLP)对函数图像进行建模仿真.前期相关研究中,MLP表现并不好,当时把这个方案已经放弃掉了.经过查阅相 ...

  2. python不支持prelu_python实现并绘制 sigmoid函数,tanh函数,ReLU函数,PReLU函数

    python实现并绘制 sigmoid函数,tanh函数,ReLU函数,PReLU函数 # -*- coding:utf-8 -*- from matplotlib import pyplot as ...

  3. relu函数_从 ReLU 到 GELU,一文概览神经网络的激活函数

    点击"机器学习算法与Python实战","置顶"公众号 重磅干货,第一时间送达 选自 | mlfromscratch    作者 | Casper Hansen ...

  4. 人工神经网络之激活函数 -RELU函数

    一句话概括:不用simgoid和tanh作为激活函数,而用ReLU作为激活函数的原因是:加速收敛. 因为sigmoid和tanh都是饱和(saturating)的.何为饱和?个人理解是把这两者的函数曲 ...

  5. relu函数为分段线性函数,为什么会增加非线性元素

    relu函数为分段线性函数,为什么会增加非线性元素 我们知道激活函数的作用就是为了为神经网络增加非线性因素,使其可以拟合任意的函数.那么relu在大于的时候就是线性函数,如果我们的输出值一直是在大于0 ...

  6. pytorch中repeat()函数理解

    pytorch中repeat()函数理解 最近在学习过程中遇到了repeat()函数的使用,这里记录一下自己对这个函数的理解. 情况1:repeat参数个数与tensor维数一致时 a = torch ...

  7. Pytorch 的repeat函数

    Pytorch 的repeat函数 看代码的时候,对于repeat函数的参数产生了疑问,再查阅资料的情况下算是搞清楚了,这篇博客作为一个学习笔记记录一下. import torchdata = tor ...

  8. ReLU函数 Vs Sigmoid 函数——XOR问题究竟用那个好

    文章目录 前言 先看问题 一.什么是激活函数(输出层中还叫激活函数吗)? 二.各个激活函数适合的情况 1.无激活函数(恒等激活函数) 2.S型曲线,例如 Sigmoid 3.线性整流函数(Rectif ...

  9. 机器学习入门(03)— 激活函数分类(阶跃函数和 sigmoid 函数的理论、实现、显示以及区别、非线性函数、ReLU 函数、tanh 函数)

    各种激活函数介绍,请参考下面链接: https://en.wikipedia.org/wiki/Activation_function 1. 阶跃函数 1.1 理论 式(3.3)表示的激活函数以阈值为 ...

最新文章

  1. 我收藏的谷歌和阿里大佬的刷题笔记
  2. 2.搭建cassandra时遇到没有公网网卡的问题
  3. php 斗鱼人数,斗鱼旭旭宝宝再度登顶指数榜首位 单日弹幕人数高达48万人
  4. oracle查看语句执行历史,AWT查看oracle历史sql语句执行
  5. 图像拼接1 特征提取
  6. springboot做网站_Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐!
  7. 知云文献翻译出现乱码的解决方式
  8. 计算机组成原理课程设计:复杂模型机
  9. 【Direct3D - 6】DirectX有哪些组件?
  10. 计算二维离散随机变量的联合概率分布
  11. 1.checkpoint防火墙安装以及高可靠性配置
  12. legion--一款开源,易用,扩展性强的半自动化渗透测试工具
  13. 员工离职率高如何解决?
  14. Datawhale:愿竞赛圈少一些人身攻击和热点炒作
  15. GPS软件接收机(3)——跟踪
  16. 【Golang】Go语言Windows GUI库XCGUI,DirectUI设计思想,高度自定义界面,支持Direct2D硬件加速
  17. 雷电网络REST API官方文档【中文版】
  18. 餐厅预订系统有哪些?餐厅预订系统怎么选择?
  19. python裁剪图片边缘模糊_Python OpenCV 图片高斯模糊
  20. 吕思清老师口中的小艺是何许人也

热门文章

  1. 大班体育游戏电子计算机教案,大班体育游戏教案:往返跑
  2. 我国首办素质体育机器人比赛 让机器人变运动员
  3. PDF电子书下载 和 企业物联网实例 视频讲解——实践类
  4. SpringBoot 飞书通知处理器
  5. 华为:解读下一代视频压缩标准HEVC(H.265)
  6. java中父子类同名变量
  7. 汇编语言常见的标志位:CF、PF、AF、ZF、SF、TF、IF、DF、OF
  8. Knife4j系列--使用/教程/实例/配置
  9. Windows平台实现Unity下窗体|摄像头|屏幕采集推送
  10. 结束北漂之后的这半年