PyTorch之nn.ReLU与F.ReLU的区别介绍
作者:鹊踏枝-码农 发布时间:2021-01-19 04:47:24
我就废话不多说了,大家还是直接看代码吧~
import torch.nn as nn
import torch.nn.functional as F
import torch.nn as nn
class AlexNet_1(nn.Module):
def __init__(self, num_classes=n):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
)
def forward(self, x):
x = self.features(x)
class AlexNet_2(nn.Module):
def __init__(self, num_classes=n):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(64),
)
def forward(self, x):
x = self.features(x)
x = F.ReLU(x)
在如上网络中,AlexNet_1与AlexNet_2实现的结果是一致的,但是可以看到将ReLU层添加到网络有两种不同的实现,即nn.ReLU和F.ReLU两种实现方法。
其中nn.ReLU作为一个层结构,必须添加到nn.Module容器中才能使用,而F.ReLU则作为一个函数调用,看上去作为一个函数调用更方便更简洁。具体使用哪种方式,取决于编程风格。
在PyTorch中,nn.X都有对应的函数版本F.X,但是并不是所有的F.X均可以用于forward或其它代码段中,因为当网络模型训练完毕时,在存储model时,在forward中的F.X函数中的参数是无法保存的。
也就是说,在forward中,使用的F.X函数一般均没有状态参数,比如F.ReLU,F.avg_pool2d等,均没有参数,它们可以用在任何代码片段中。
补充知识:pytorch小知识点——in-place operation
一、什么是in-place
在pytorch的很多函数中经常看到in-place选项,具体是什么意思一直一知半解。这次专门来学习一下,in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以把它称为原地操作符。
在pytorch中经常加后缀“_”来代表原地in-place operation,比如说.add_() 或者.scatter()。我们可以将in_place操作简单的理解类似于python中的"+=","-="等操作。
举个例子,下面是正常的加操作,执行结束后x的值没有变化
import torch
x = torch.rand(2)
x
Out[3]: tensor([0.3486, 0.2924]) #<-----这是x初始值
y = torch.rand(2)
y
Out[5]: tensor([0.6301, 0.0101]) #<-----这是y初始值
x.add(y)
Out[6]: tensor([0.9788, 0.3026]) #<-----这是x+y的结果
x
Out[7]: tensor([0.3486, 0.2924]) #<-----这是执行操作之后x的值
y
Out[8]: tensor([0.6301, 0.0101]) #<-----这是执行操作之后y的值
我们可以发现,在正常操作之后原操作数的值不会发生变化。
下面我们来看看in_place操作
import torch
x = torch.rand(2)
x
Out[3]: tensor([0.3486, 0.2924]) #<-----这是x初始值
y = torch.rand(2)
y
Out[5]: tensor([0.6301, 0.0101]) #<-----这是y初始值
x.add_(y)
Out[9]: tensor([0.9788, 0.3026]) #<-----这是x+y结果
x
Out[10]: tensor([0.9788, 0.3026]) #<-----这是操作后x的值
y
Out[11]: tensor([0.6301, 0.0101]) #<-----这是操作后y的值
通过对比可以发现,in_place操作之后,原操作数等于表达式计算结果。也就是说将计算结果赋给了原操作数。
二、不能使用in-place的情况
对于 requires_grad=True 的 叶子张量(leaf tensor) 不能使用 inplace operation
对于在 求梯度阶段需要用到的张量 不能使用 inplace operation
来源:https://blog.csdn.net/u011501388/article/details/86602275
猜你喜欢
- 注释:在大多数的情况下,修改MySQL是需要有mysql里的root权限的,所以一般用户无法更改密码,除非请求管理员。方法1使用phpmya
- re.findall()方法及re.compile()re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;如果
- pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下:class torch.nn.Conv2d(in_channels, o
- 本文实例讲述了python+Django+apache的配置方法。分享给大家供大家参考,具体如下:下载安装xampp套件下载mod_pyth
- 代码: <?php $page=$_GET['page']; include($page.'php')
- python类class定义及其初始化定义类,功能,属性一般类名首字母大写class Calculator:#名字和价格是属性
- 本文实例讲述了PHP单例模式用法。分享给大家供大家参考,具体如下:<?phpclass db { public $conn
- Google Talk是一个功能很简洁的即时通讯工具,尤其是它的文字输入区域,不同于其他IM,除了一个文字输入区域外没有任何其他操作。但是用
- 最近在学习python,做一些python练习题github上几年前的练习题有一题是这样的:使用 Python 实现:对着电脑吼一声,自动打
- 一:工具准备Anaconda:是一个开源的Python发行版本,其中包含了conda、Python等180多个科学包及其依赖项。【Anaco
- 以下代码实现了ip查询功能处理程序 import os,timedef getip(filepath):
- 关于电脑的垃圾清理操作,已经有很多的成熟的软件可以帮助我们完成C盘的垃圾清理操作,比如360等等。但是使用三方的清理软件往往伴随着很多的广告
- 一、前言一首歌热门了,参与评论的人也很多,那我们有时候想看看评论,也只能看看热门的评论,大部分人都说的什么,咱也不知道呀~那本次咱们就把歌词
- 具体代码如下所示:#coding=utf8from urllib import requestimport reimport urllib,
- 见以下两个文件:showimage.asp Change the HTTP header
- 本文实例讲述了Python实现简单求解给定整数的质因数算法。分享给大家供大家参考,具体如下:接着做题遇到求解质因数分解的问题,思想很简单,就
- 引言近期网上这位卖蜂蜜的小伙鬼畜挺火的,大家质疑背景造假,这里我就带着大家实现“背景造假”(PS:原
- 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下:1、scatter函数原型2、其
- 一、'建立register.asp 代码如下:<%@ language=vbscript %>&nb
- 执行效果如下:from tkinter import *import urllib.requestimport gzipimport jso