Pytorch中torch.nn.conv2d和torch.nn.functional.conv2d的区别

【PyTorch】nn.Conv2d函数详解 阅读详情

在写 PyTorch 代码时,我们会发现在 torch.nn.xxx 和 torch.nn.functional.xxx 中有一些功能重复的操作,比如卷积、激活、池化。这些操作有什么不同?各有什么用处?

首先可以观察源码:

eg:torch.nn.Conv2d

CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

在这里插入图片描述

eg:torch.nn.functional

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor

在这里插入图片描述

从中,我们可以发现,nn.Conv2d 是一个类,而 nn.functional.conv2d是一个函数。

换言之:

nn.Module 实现的 layer 是由 class Layer(nn.Module) 定义的特殊类
nn.functional 中的函数更像是纯函数,由 def function(input) 定义
此外:

两者的调用方式不同:调用 nn.xxx 时要先在里面传入超参数,然后再将数据以函数调用的方式传入 nn.xxx

# torch.nn
inputs =  torch.randn(64, 3, 244, 244)
self.conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)
outputs = self.conv(inputs)

# torch.nn.functional    需要同时传入数据和 weight,bias等参数
inputs =  torch.randn(64, 3, 244, 244)
weight = torch.randn(64, 3, 3, 3)
bias = torch.randn(64)
outputs = nn.functinoal.conv2d(inputs, weight, bias, padding=1)

nn.xxx 能够放在 nn.Sequential里,而 nn.functional.xxx 就不行

nn.functional.xxx 需要自己定义 weight,每次调用时都需要手动传入 weight,而 nn.xxx 则不用

import torch
import torch.nn as nn
import torch.nn.functional as F

# torch.nn 定义的CNN
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()

        self.conv_1 = nn.Conv2d(1, 16, krenel_size=5, padding=0)
        self.relu_1 = nn.ReLU(inplace=True)
        self.maxpool_1 = nn.MaxPool2d(kernel_size=2)

        self.conv_2 = nn.Conv2d(16, 32, krenel_size=5, padding=0)
        self.relu_2 = nn.ReLU(inplace=True)
        self.maxpool_2 = nn.MaxPool2d(kernel_size=2)   

        self.linear = nn.Linear(4*4*32, 10)

    def forward(self, x):
        x = x.view(x.size(0), -1)
        out = self.maxpool_1(self.relu_1(self.conv_1(x)))
        out = self.maxpool_2(self.relu_2(self.conv_2(out)))
        out = self.linear(out.view(x.size(0), -1))
        return out

# torch.nn.functional 定义一个相同的CNN
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()

        self.conv_1_weight = nn.Parameter(torch.randn(16, 1, 5, 5))
        self.bias_1_weight = nn.Parameter(torch.randn(16))

        self.conv_2_weight = nn.Parameter(torch.randn(32, 16, 5, 5))
        self.bias_2_weight = nn.Parameter(torch.randn(32))

        self.linear_weight = nn.Parameter(torch.randn(4 * 4 * 32, 10))
        self.bias_weight = nn.Parameter(torch.randn(10))

    def forward(self, x):
        x = x.view(x.size(0), -1)
        out = F.conv2d(x, self.conv_1_weight, self.bias_1_weight)
        out = F.conv2d(out, self.conv_2_weight, self.bias_2_weight)
        out = F.linear(out.view(x.size(0), -1), self.linear_weight, self.bias_weight)

在使用Dropout时,推荐使用 nn.xxx。因为一般只有训练时才使用 Dropout,在验证或测试时不需要使用 Dropout。使用 nn.Dropout时,如果调用 model.eval() ,模型的 Dropout 层都会关闭;但如果使用 nn.functional.dropout,在调用 model.eval() 时,不会关闭 Dropout。

当我们想要自定义卷积核时,是不能使用torch.nn.ConvNd 的,因为它里面的权重都是需要学习的参数,没有办法自行定义。但是,我们可以使用 torch.nn.functional.conv2d() 。

pytorch之卷积模块、池化、激活函数(可视化) pytorch之卷积模块 卷积 卷积在 pytorch 中有两种方式,一种是 torch.nn.Conv2d(),一种是torch.nn.functional.conv2d(),这两种形式本质都是使用一个卷积操作这两种形式的卷积对于输入的要求都是一样的,首先需要输入是一个 torch.autograd.Variable() 的类型,大小是 (batch, channel, H, W),其中 bat... 阅读详情

相关推荐

常用torch.nn

常用基础pytorch知识

m0_37737957的博客 1684

torch.nn.functional.conv2d函数详解

记torch.nn.functional为F。 F.conv1d与F.conv2d的区别在于: 设input的大小为chanel * in_height * in_width,filter的大小为chanel * f_height * f_width。 F.conv1d in_height=f_height,在一次卷积计算中,filter只在input的最后一个维度上扫描,即参数stride的取...

Una_zh 1万+

基于51单片机的智能灌溉系统

基于51单片机的智能灌溉系统

jiejiezuishuai的博客 2100

PyTorch学习之torch.nn.functional.conv2d函数

是 PyTorch 中用于进行二维卷积操作的函数。卷积操作是深度学习中卷积神经网络(CNN)的核心部分,用于提取图像特征,常见于图像分类、目标检测和语义分割等任务中。

qq_46396470的博客 1476

【深度学习】普通卷积、DWconv(逐深度卷积)与PWconv(逐点卷积)以及DSconv(深度可分离卷积)

深度可分离卷积(Depthwise Separable Convolution)通过将常规卷积分解为逐通道卷积(Depthwise)和逐点卷积(Pointwise)两步,显著减少了参数量和计算成本。常规卷积同时提取空间和通道特征,而深度可分离卷积先对每个通道单独进行空间卷积,再用1×1卷积调整通道数。以输入3通道、输出4通道的64×64图像为例,常规卷积需108个参数,而深度可分离卷积仅需39个参数,减少了约2/3。这种结构在轻量级网络(如MobileNet)中广泛应用,可在保持性能的同时降低计算资源需求。

猫天意的博客 4051

torch.nn.functional.conv2d 函数详解

形式:torch.nn.functional.conv2d(input,filters,bias,stride,padding,dilation,groups) 返回值:一个Tensor变量 作用:在输入图像input中使用filters做卷积运算 参数的具体意义: input代表输入图像的大小(minibatch,in_channels,H,W),是一个四维tensor filters...

Li7819559的博客 1万+

硬件基础——mos管

文章目录前言一、寄生参数二、使用步骤1.引入库2.读入数据总结 前言 MOS管设计重点 一、寄生参数 1.寄生电容 mos管有寄生电容Cgs,此电容大小一般为pF级别,一般规格书可以查到。 使用时,要特别注意GS管教的寄生电容Cgs,控制MOS管的导通与截止,本质上是控制Cgs电容的充放电。(最好要加限流) 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt imp

Malqaq的博客 6593

Pytorch 中 torch.nn.Conv2d和torch.nn.functional.conv2d的区别

Pytorch 中 torch.nn.Conv2d和torch.nn.functional.conv2d的区别

Z2572862506的博客 632

别再只用GPS了!用Android手机传感器实现室内步行轨迹记录(避坑指南)

本文详细介绍了如何利用Android手机传感器(如加速度计、陀螺仪和磁力计)实现室内步行轨迹记录,克服GPS在室内的局限性。通过传感器数据采集、步态检测、航向估计和轨迹绘制等步骤,结合避坑指南和优化技巧,帮助开发者高效构建室内定位应用。

weixin_26821003的博客 274

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 937

Pytorch中torch.nn.functional与torch.nn中的conv2d的不同点(一看就理解!)

从调用方式、参数传递、状态保持、灵活性四方面简要得分析了torch.nn.functional与torch.nn中conv2d不同

weixin_61333208的博客 550

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2644

Pytorch——Conv2d、conv2d

Conv2d、conv2d是pytorch中进行卷积操作的2个类,虽然只是首字母大小写不同,使用起来方法也不一样,一个是类,一个是函数。 1 Conv2d Conv2d是torch.nn中的类 1.1 初始化 CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=N

talkAC的博客 4782

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 140

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习之pytorch 中 torch.nn介绍

pytorch 中必用的包就是 torch.nn,torch.nn 中按照功能分,主要如下有几类:1. Layers(层):包括全连接层、卷积层、池化层等。2. Activation Functions(激活函数):包括ReLU、Sigmoid、Tanh等。3. Loss Functions(损失函数):包括交叉熵损失、均方误差等。4. Optimizers(优化器):包括SGD、Adam、RMSprop等。

qinbaby的专栏 2892

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

torch.nn.functional.conv2d的用法

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor 注意:!!! 对F.conv2d一样适用

qq_45171138的博客 5590

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

torch.nn和torch.nn.functional区别

在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看出差别,先拿torch.nn.Conv2d torch.nn.Conv2d [](javascript:void(0)😉 class Conv2d(_ConvNd): def __init__(self, in_channels, out_channels, kernel_size, stride

Yohuna的博客 2674

Pytorch 学习第【5】天

目录1. 构建基本的神经网络1.1 定义自己的神经网络1.1.1 nn.Module类1.1.2 例子三级目录 1. 构建基本的神经网络 神经网络由对数据进行操作的层/模块组成。torch.nn命名空间提供了构建自己的神经网络所需的所有构建模块。PyTorch中的每个模块都子类化了nn.Module。一个神经网络本身就是一个由其他模块(层)组成的模块。这种嵌套结构允许轻松构建和管理复杂的架构。 1.1 定义自己的神经网络 我们通过子类化 nn.Module 来定义我们的神经网络,并在 init 中初始化神经

weixin_43798572的博客 1751

Pythorch的nn.functional和Parameter

Convolution函数 2D卷积 torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) 参数: input – 输入张量 (minibatch x in_channels x iH x iW) weight – 过滤器张量 (out_channels, ...

yuki___的博客 220

torch框架学习过程遇到问题

pytorch框架学习

m0_51312071的博客 467

pyotrch学习篇——第一篇

学习pytorch官网网络之Alexnet。实现使用fashion_mnist数据集合训练网络,并解释torch.nn.Conv2d 和 torch.nn.functional.conv2d 的不同,以及transforms的一些概念使用

To_be_little的博客 558

神经网络基本结构的使用(Convolution Layers的使用)1

torch.nn相当于把齿轮封装好的,直接提供给我们的方向盘 torch.nn.functional相当于开车时齿轮的运转 TORCH.NN.FUNCTIONAL.CONV2D torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor 代码实战: import torch import torch.nn.functional as F # 写入二维矩

爱学习的小登西的博客 217

【pytorch】是否应该把ReLu或者sigmoid放在 __init__中

背景 学习Pytorch 创建模型的时候,总会遇到一些困惑: 不知道是否应该把ReLu或者sigmoid放在 __init__中 是不知道要把layer放在 _init_() 中还是 forwad() 中 也不知道到底该使用nn.Conv2d 还是F.conv2d. 理解 请移步另一篇Pytoch 中 torch.nn 与 torch.nn.functional 的区别 另附 此为我在pyt...

One Way的博客 637
上一篇: win10下jupyter notebook工作路径的配置
下一篇: pytorch针对图像数据增强的方法
那记忆微凉
博客等级 码龄9年 412粉丝 387原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值