0606-nn.functional

pytorch完整教程目录:https://www.cnblogs.com/nickchen121/p/14662511.html

一、nn.functional 和 nn.Module 的区别

nn 中还有一个经常使用的模块 nn.functional,nn 中的绝大多数的 layer 在 functional 中都有一个和它对应的函数。

nn.functionalnn.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的更多相关文章

  1. torch.nn.functional中softmax的作用及其参数说明

    参考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/functional/#_1 class torch.nn.Soft ...

  2. PyTorch 中,nn 与 nn.functional 有什么区别?

    作者:infiniteft链接:https://www.zhihu.com/question/66782101/answer/579393790来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...

  3. 『PyTorch』第十二弹_nn.Module和nn.functional

    大部分nn中的层class都有nn.function对应,其区别是: nn.Module实现的layer是由class Layer(nn.Module)定义的特殊类,会自动提取可学习参数nn.Para ...

  4. PyTorch : torch.nn.xxx 和 torch.nn.functional.xxx

    PyTorch : torch.nn.xxx 和 torch.nn.functional.xxx 在写 PyTorch 代码时,我们会发现一些功能重复的操作,比如卷积.激活.池化等操作.这些操作分别可 ...

  5. pytorch torch.nn.functional实现插值和上采样

    interpolate torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', ali ...

  6. [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 ...

  7. Pytorch本人疑问(1) torch.nn和torch.nn.functional之间的区别

    在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看 ...

  8. 从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系

    从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系 relu多种实现之间的关系 relu 函数在 pytorch 中总共有 3 次出现: torc ...

  9. Pytorch中pad函数toch.nn.functional.pad()的用法

    padding操作是给图像外围加像素点. 为了实际说明操作过程,这里我们使用一张实际的图片来做一下处理. 这张图片是大小是(256,256),使用pad来给它加上一个黑色的边框.具体代码如下: 1 2 ...

  10. PyTorch官方中文文档:torch.nn

    torch.nn Parameters class torch.nn.Parameter() 艾伯特(http://www.aibbt.com/)国内第一家人工智能门户,微信公众号:aibbtcom ...

随机推荐

  1. 【C3】02 操作总览

    在这篇文章中,我们将会拿一个简单的HTML文档做例子,并且在上边使用CSS样式,期待你能在此过程中学会更多有关CSS的实战性知识. 前置知识 在开始本单元之前,您应该: 基本熟悉计算机操作. 基本工作 ...

  2. 个人自家使用的路由器:水星D121G —— 1200M 11AC双频千兆无线路由器 D121G

    地址: https://www.mercurycom.com.cn/product-465-0.html

  3. 《Python数据可视化之matplotlib实践》 源码 第四篇 扩展 第十章

    图 10.1 import matplotlib.pyplot as plt import numpy as np plt.axes([0.1, 0.7, 0.3, 0.3], frameon=Tru ...

  4. 由于美国的制程限制,假如我国的同等性能的AI芯片5年内无法实现量产化我们应该如何发展我们的AI领域的基础设施呢?

    相关: 美晶片禁令面難題!封過頭反把市場送中國? 今年华为公司推出了mate pro60手机,可以说我们可以实现7nm芯片的制造了,但是要注意,我们在实现7nm芯片制造的时候使用的应该依旧是被美国限制 ...

  5. 分段树(segment tree)的实现 —— 强化学习中 "优先级回放机制" 的重要组成部分

    分段树(segment tree)是强化学习中 "优先级回放机制" 的重要组成部分.本文针对分段树(segment tree)的一个开源版本的实现来进行分析,代码地址: https ...

  6. 在Ubuntu18.04系统中源码安装 gcc7.3.0

    本文给出源码安装gcc7.3.0的方法. 依赖的环境安装到自建文件夹下, 给出下面操作中环境的安装文件夹: /home/devilmaycry/anaconda3/mindspore_envs这个路径 ...

  7. How to 'apt-get install python-opengl' on Ubuntu22.04

    ImportError: Error occurred while running `from pyglet.gl import *` HINT: make sure you have OpenGL ...

  8. 2024年Apache DolphinScheduler RoadMap:引领开源调度系统的未来

    非常欢迎大家来到Apache DolphinScheduler社区!随着开源技术在全球范围内的快速发展,社区的贡献者 "同仁" 一直致力于构建一个强大而活跃的开源调度系统社区,为用 ...

  9. 一口Linux公众号粉丝破万了!

    0.楔子 终于万粉了! 总算熬过了冷启动阶段. 一万这个小目标看着很简单, 但是实际做的时候,发现远没有自己想的那么容易. 亿万粉丝,其实并不是很多,一度犹豫要不要写这个万份总结, 和嵌入式领域内的一 ...

  10. Linux内核如何访问另外一个模块的函数和变量 原创

    一.问题整理 内核中两个模块,一个A,一个B,A模块中有操作函数,B模块要调用A模块的函数. 二.分析 这是一个驱动工程师经常遇到的一个问题,该问题其实是模块符号导出问题,实现该功能比较简单,借助EX ...