0606-nn.functional
0606-nn.functional
pytorch完整教程目录:https://www.cnblogs.com/nickchen121/p/14662511.html
一、nn.functional 和 nn.Module 的区别
nn 中还有一个经常使用的模块 nn.functional,nn 中的绝大多数的 layer 在 functional 中都有一个和它对应的函数。
nn.functional 和 nn.Module的区别在于,Module 实现的 layers 是一个特殊的类,由 class Layer(nn.Module) 定义,会自动提取可学习的参数;而 functional 中的函数更像是一个纯函数,由 def fucntion(input) 定义。
import torch as t
from torch import nn
from torch.autograd import Variable as V
inp = V(t.randn(2, 3))
model = nn.Linear(3, 4)
output1 = model(inp)
output2 = nn.functional.linear(inp, model.weight, model.bias)
output1 == output2
tensor([[True, True, True, True],
[True, True, True, True]])
b = nn.functional.relu(inp)
b2 = nn.ReLU()(inp)
b == b2
tensor([[True, True, True],
[True, True, True]])
从上述代码可以看到 Module 和 functional 的功能类似,那么这两者我们什么时候会用到呢?
答案很简单,如果有可学习的参数时,最好用 Module,反之既可以用 functional,当然也可以用 Module,因为二者在性能上并没有很大的差别。
例如,由于激活函数、池化等层没有可学习参数,可以使用对应的 functional 函数代替,而卷积、全连接层有可学习参数,尽量使用 Module。
但是有一个例外,dropout 操作也没有可学习参数,但是由于 dropout 操作在训练和测试两个阶段的行为有区别,如果使用 Module 对象那个能够通过 model.eval 加以区分。
二、nn.functional 和 nn.Module 结合使用
下面举例将 functional 和 Module 结合使用。
from torch.nn import functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = F.pool(F.relu(self.conv1(x)), 2)
x = F.pool(F.relu(self.conv2(x)), 2)
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
没有可学习参数的层,可以用函数代替他们,因此可以不用放在构造函数中。
对于有可学习参数的层,虽然也可以用 functional 替代,只不过实现起来步骤麻烦,需要自己手动定义参数,比如前面实现的全连接层,既可以吧 weight 和 bias 两个参数拿出来,在构造函数中初始化为 parameter,例子如下:
class MyLinear(nn.Module):
def __init__(self):
super(MyLinear, sefl).__init__()
self.weight = nn.Parameter(t.randn(3, 4))
self.bias = nn.Parameter(t.zeros(3))
def forward(self):
return F.linear(input, weight, bias)
从上面的代码可以看出,如果通过 functional 去构造一个具有可学习参数的层,是非常麻烦的,不如 Module 那样简便。
很多同学现在可能会想,functional 看起也不是那么方便,并且 Module 已经够好了,为什么还要设计 functional 呢?想深入了解 functional 和 Module的区别的同学,可以参考论坛的讨论和作者写的说明:https://discuss.pytorch.org/search?q=nn.functional
0606-nn.functional的更多相关文章
- torch.nn.functional中softmax的作用及其参数说明
参考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/functional/#_1 class torch.nn.Soft ...
- PyTorch 中,nn 与 nn.functional 有什么区别?
作者:infiniteft链接:https://www.zhihu.com/question/66782101/answer/579393790来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- 『PyTorch』第十二弹_nn.Module和nn.functional
大部分nn中的层class都有nn.function对应,其区别是: nn.Module实现的layer是由class Layer(nn.Module)定义的特殊类,会自动提取可学习参数nn.Para ...
- PyTorch : torch.nn.xxx 和 torch.nn.functional.xxx
PyTorch : torch.nn.xxx 和 torch.nn.functional.xxx 在写 PyTorch 代码时,我们会发现一些功能重复的操作,比如卷积.激活.池化等操作.这些操作分别可 ...
- pytorch torch.nn.functional实现插值和上采样
interpolate torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', ali ...
- [pytorch笔记] torch.nn vs torch.nn.functional; model.eval() vs torch.no_grad(); nn.Sequential() vs nn.moduleList
1. torch.nn与torch.nn.functional之间的区别和联系 https://blog.csdn.net/GZHermit/article/details/78730856 nn和n ...
- Pytorch本人疑问(1) torch.nn和torch.nn.functional之间的区别
在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看 ...
- 从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系
从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系 relu多种实现之间的关系 relu 函数在 pytorch 中总共有 3 次出现: torc ...
- Pytorch中pad函数toch.nn.functional.pad()的用法
padding操作是给图像外围加像素点. 为了实际说明操作过程,这里我们使用一张实际的图片来做一下处理. 这张图片是大小是(256,256),使用pad来给它加上一个黑色的边框.具体代码如下: 1 2 ...
- PyTorch官方中文文档:torch.nn
torch.nn Parameters class torch.nn.Parameter() 艾伯特(http://www.aibbt.com/)国内第一家人工智能门户,微信公众号:aibbtcom ...
随机推荐
- 【Hibernate】01 概述
什么是Hibernate? - Hibernate是我们JavaEE开发中的DAO层框架 - DAO[Data Access Object] 数据访问对象层 - 在DAO层,访问数据库,进行CRUD操 ...
- python画图报错:OSError: 'seaborn-whitegrid' is not a valid package style
解决方法: https://stackoverflow.com/questions/78019854/matplotlib-seaborn-whitegrid-is-not-a-valid-packa ...
- 【转载】 浅谈PyTorch的可重复性问题(如何使实验结果可复现)
原文地址: https://www.zhangshengrong.com/p/9MNlDK09NJ/ ================================================ ...
- AQS专题
1.背景 2.预备知识 2.1.park.unpark.interrupt.isInterrupted.interrupted方法的理解 一:park.unpark 1.park.unpark它不是T ...
- 利用Linux系统提供的和调度器相关的接口让进程或线程对某个处理器进行绑定
目录 设置进程与CPU的亲和性 设置线程与CPU的亲和性 设置进程与CPU的亲和性 taskset命令允许你查看或设置运行中的进程的CPU亲和性(即该进程可以在哪些CPU上运行). 要将一个已经运行的 ...
- SMU Summer 2023 Contest Round 9(2019 山东省大学生程序设计竞赛)
2019 山东省大学生程序设计竞赛 A. Calandar 纯模拟吧(感觉我做麻烦了(?), 就是如果问的是未来的日期,就用相隔天数取模后加上这天的星期, 如果问的是曾经的,就用这天的星期减去相隔天数 ...
- 2023 CCPC 桂林题解
gym H. Sweet Sugar 一个经典贪心是从下到上,如果子树 \(u\) 剩下的部分(一定包含 \(u\))包含合法连通块,那么这个连通块给答案贡献 \(1\),切断 \(u\) 与 \(f ...
- NYX靶机笔记
NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址:https://download.vulnhub.com/nyx/nyxvm.zip 1.nmap扫描 1)主机发现 # -sn 只做pin ...
- LLM 写标书
云孚科技 有提到标书写作 https://www.sohu.com/a/726319389_121119682 https://www.aihub.cn/tools/writing/yfwrite/ ...
- mysql vs mongodb
Comments MongoDB 是NoSQL 数据库,适合存JSON格式数据,MySQL是关系型数据库,适合存table格式数据 MongoDB扩展性更好,MySQL支持主从和cluster但是感觉 ...