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. 人形机器人的AI技术 —— 将一个大问题拆解为若干个小问题

    前文: 人形机器人 -- Figure 01机器人亮相 | OpenAI多模态能力加持 | 与人类流畅对话交互 | 具身智能的GPT-4时刻 所需的AI技术: 人形机器人的软件层面其实有: 视觉模块/ ...

  2. python报错:ImportError: cannot import name 'Literal' from 'typing'

    原因: Literal 只支持python3.8版本以上的环境,需要把python3.7升级到3.8版本以上. 参考: https://blog.csdn.net/yuhaix/article/det ...

  3. 什么是MMU

    一.MMU的定义   MMU是Memory Management Unit的缩写,中文名是内存管理单元,有时也称作分页内存管理单元(Paged Memory Management Unit,缩写为PM ...

  4. cdq分治 基础篇

    简介 前置芝士:归并排序. \(cdq\) 分治是个离线算法,可以解决三维偏序或者优化 \(dp\). 陌上花开 维护三维偏序有个口诀:一维排序,二维归并,三维数据结构. 考虑第一维直接排序解决掉,然 ...

  5. 数字名片工具 BBlog:使用一个链接,快速创建和分享你的信息主页和数字花园

    数字名片 BBlog:使用一个链接,快速创建和分享你的信息主页和数字花园 随着移动互联网技术的快速发展,数字名片产品已成为现代社交和网络营销的重要工具.数字名片可以帮助个人和企业在各种场合中展示和分享 ...

  6. 直接在jsp页面上使用flex标签

    1:去ADOBE下载FLEX的TAGLIB for JSP. http://download.macromedia.com/pub/labs/flex2_tag_library_jsp/flex2_t ...

  7. 100ASK_IMX6ULL arm板子如何移植刷卡器

    最近为了在arm板子上移植刷卡器,比较简单,但也遇到了坑,现在和大家分享下. 购买刷卡器 某宝很多,应该选哪一种呢? 一口君一共买了4种刷卡器,有2种可以用,还有2种不能用. 下图为最方便的一款,一口 ...

  8. 禅道项目管理系统权限绕过漏洞(QVD-2024-15263)

    本文所涉及的任何技术.信息或工具,仅供学习和参考之用,请勿将文章内的相关技术用于非法目的,如有相关非法行为与文章作者无关.请遵守<中华人民共和国网络安全法>. 1. 概述 1.1 基本信息 ...

  9. Python正则表达式提取车牌号

    在Python中使用正则表达式(Regular Expressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时.中国的车牌号格式多种多样,但通常包含省份简称.英 ...

  10. 6.2K star!推荐一款开源混沌工程测试平台:Chaos Mesh

    1.Chaos Mesh 介绍 Chaos Mesh是一个开源的混沌工程平台,旨在帮助用户在生产环境中测试.验证和优化其应用程序的可靠性和稳定性.通过引入故障注入和混沌工程原则,Chaos Mesh可 ...