- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PyTorch之nn.ReLU与F.ReLU的区别介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我就废话不多说了,大家还是直接看代码吧~ 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 。
1、什么是in-place 。
在pytorch的很多函数中经常看到in-place选项,具体是什么意思一直一知半解。这次专门来学习一下,in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以把它称为原地操作符.
在pytorch中经常加后缀“_”来代表原地in-place operation,比如说.add_() 或者.scatter()。我们可以将in_place操作简单的理解类似于python中的"+=","-="等操作.
举个例子,下面是正常的加操作,执行结束后x的值没有变化 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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操作 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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操作之后,原操作数等于表达式计算结果。也就是说将计算结果赋给了原操作数.
2、不能使用in-place的情况 。
对于 requires_grad=True 的 叶子张量(leaf tensor) 不能使用 inplace operation 。
对于在 求梯度阶段需要用到的张量 不能使用 inplace operation 。
以上这篇PyTorch之nn.ReLU与F.ReLU的区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/u011501388/article/details/86602275 。
最后此篇关于PyTorch之nn.ReLU与F.ReLU的区别介绍的文章就讲到这里了,如果你想了解更多关于PyTorch之nn.ReLU与F.ReLU的区别介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下代码: interface F { (): string; a(): number; } function f() { return '3'; } f['a'] = f
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我需要编写一个要在 GHCi 上运行的模块,并将函数组合为相同的函数。这个(经典的fog(x) = f(g(x)))运行: (.) f g = (\x -> f (g x)). 当我尝试这样写时出现问
动态规划这里有一个问题 大写字母AZ对应于整数[-13,12],因此一个字符串对应于一整列。我们将对应的整列的总和称为字符串的特征值。例如:字符串ACM对应的总体列为{-13,-11,-1},则ACM
我想知道为什么 F-Sharp 不支持无穷大。 这适用于 Ruby(但不适用于 f#): let numbers n = [1 .. 1/0] |> Seq.take(n) -> System.Div
如何从已编译的 F# 程序中的字符串执行 F# 代码? 最佳答案 这是一个小脚本,它使用 FSharp CodeDom 将字符串编译为程序集,并将其动态加载到脚本 session 中。 它使用类型扩展
有什么方法可以在 F# List 和 F# Tuple 之间转换? 例如: [1;2;3] -> (1,2,3) (1,2,3,4) -> [1;2;3;4] 我需要两个函数来做到这一点: le
我想将一个或多个 .fsx 文件加载到 F# 交互中,并将 .fsx 文件中定义的所有函数都包含在作用域中,以便我可以直接使用控制台中的功能。 #load 指令执行指定的 .fsx 文件,但随后我无法
我正在尝试像 this page 中那样编写 F 代数.不同之处在于,不是用元组组合,而是像这样: type FAlgebra[F[_], A] = F[A] => A def algebraZip[
给定一个 F# 记录: type R = { X : string ; Y : string } 和两个对象: let a = { X = null ; Y = "##" } let b = {
所以我们有一组文件名\url,如file、folder/file、folder/file2、folder/file3、folder/folder2/fileN等。我们得到一个字符串,如文件夹/。我们想
假设我有一个字符串“COLIN”。 这个字符串的数值是: 3 + 15 + 12 + 9 + 14 = 53. 所以 A = 1, B = 2, C = 3, and so on. 为此,我什至不知道
在 C# 中,我有以下代码来创建一个对象实例。 var myObject = new MyClass("paramvalue") { Property1 = "value1" Proper
即,标准库中有这样的函数吗? let ret x _ = x 为了保持代码可读性,我想尽量减少自制基本构建功能构建块的数量,并使用现有的东西。 最佳答案 不。你可能想看看 FSharpX。 关于f#
目前,我有一个函数可以将列表中每个列表的第一个元素( float )返回到单独的列表。 let firstElements list = match list with | head:
我刚刚解决了problem23在 Project Euler 中,我需要一个 set 来存储所有丰富的数字。 F# 有一个不可变集合,我可以使用 Set.empty.Add(i) 创建一个包含数字 i
F#语言具有计算自然对数的函数log和计算以10为底的对数的log10。 在F#中以2为底的对数的最佳计算方法是什么? 最佳答案 您可以简单地使用以下事实:“ b的a对数” = ln(b)/ ln(a
动机 我有一个长时间运行的 bool 函数,它应该在数组中执行,如果数组中的元素满足条件,我想立即返回。我想并行搜索并在第一个完整线程返回正确答案时终止其他线程。 问题 在 F# 中实现并行存在函数的
我最近完成了一个生成字符串列表的项目,我想知道执行此操作的最佳方法。 字符串生成是上下文敏感的,以确定它是否可以接受(这是游戏中的一系列游戏,所以你必须知道最后一次游戏是什么) 我这样做的方法是使用一
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!