pytorch __init__、forward与__call__的用法小结
作者:时光碎了天 发布时间:2023-09-04 13:20:47
1.介绍
当我们使用pytorch来构建网络框架的时候,也会遇到和tensorflow(tensorflow __init__、build 和call小结)类似的情况,即经常会遇到__init__、forward和call这三个互相搭配着使用,那么它们的主要区别又在哪里呢?
1)__init__主要用来做参数初始化用,比如我们要初始化卷积的一些参数,就可以放到这里面,这点和tf里面的用法是一样的
2)forward是表示一个前向传播,构建网络层的先后运算步骤
3)__call__的功能其实和forward类似,所以很多时候,我们构建网络的时候,可以用__call__替代forward函数,但它们两个的区别又在哪里呢?
当网络构建完之后,调__call__的时候,会去先调forward,即__call__其实是包了一层forward,所以会导致两者的功能类似。
在pytorch在nn.Module中,实现了__call__方法,而在__call__方法中调用了forward函数:
https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/module.py
2.代码
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self, in_channels, mid_channels, out_channels):
super(Net, self).__init__()
self.conv0 = torch.nn.Sequential(
torch.nn.Conv2d(in_channels, mid_channels, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)),
torch.nn.LeakyReLU())
self.conv1 = torch.nn.Sequential(
torch.nn.Conv2d(mid_channels, out_channels * 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
def forward(self, x):
x = self.conv0(x)
x = self.conv1(x)
return x
class Net(nn.Module):
def __init__(self, in_channels, mid_channels, out_channels):
super(Net, self).__init__()
self.conv0 = torch.nn.Sequential(
torch.nn.Conv2d(in_channels, mid_channels, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)),
torch.nn.LeakyReLU())
self.conv1 = torch.nn.Sequential(
torch.nn.Conv2d(mid_channels, out_channels * 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
def __call__(self, x):
x = self.conv0(x)
x = self.conv1(x)
return x
补充:torch/nn目录结构以及__init__.py
torch/nn目录结构以及init.py
torch/nn目录结构
__init__.py:
from .modules import *
#nn.modules 导入modules目录下内容 定义容器modules
from .parameter import Parameter
#nn.Parameter 导入parameter.py 定义parameter
from .parallel import DataParallel
#导入parallel目录下data_parallel.py中的DataParallel类
from . import init
#nn.init 导入init.py 参数初始化
from . import utils
#nn.utils 导入utils目录下内容 官网api下nn.utils下api
对于backends, functional.py, _functions 需要在代码前重新Import
例如我们常用的
import torch.nn.functional as F 就是导入了functional.py
backends和_functions是functional.py实现各种函数时所用到的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/u013289254/article/details/103826591
猜你喜欢
- 任何熟悉SQL和关系数据库的人都遇见过大量的连接类型。最简单的说,连接(join)会把两个表的内容组合到一个虚拟表或者recordset内。
- 一、图图:数据(张量Tenrsor)+ 操作(节点Operation) (静态)图可以用:1、默认图;2、自定义图。1、默认图查看默认图的方
- 安装conda activate ps pip install visdom激活ps的环境,在指定的ps环境中安装visdom开启pytho
- 最近公司在研发app,选择了基于Vue框架的vux组件库,现总结在实现上拉刷新功能遇到的坑:1.问题:只刷新一次,解决方法:需要自己手动重置
- (1)int转strings := strconv.Itoa(i)等价于s := strconv.FormatInt(int64(i), 1
- 1、检查数据库完整性dbcc checkdb(test)--通过加tablock提高速度 dbcc checkdb(test) with t
- <html> <head> <meta http-equiv="Content-Type"
- 什么是装饰器从字面意思上来看,装饰器是用来装饰其他东西的工具。在python中装饰器分为函数装饰器和类装饰器。简而言之,函数装饰器是用来装饰
- vue2.x前置概念:路由钩子分类一共分3类, 7个钩子路由和组件的概念(方便理解钩子函数)路由和组件是2个概念, 可以粗犷的认为:路由是浏
- 使用数据库的过程中,由于断电或其他原因,有可能导致数据库出现一些小错误,比如检索某些表特别慢,查询不到符合条件的数据等。出现这些情况的原因,
- 一、前言在上一小节,我们介绍了文件的基本操作以及数据交换的格式,为了巩固我们上一节文件操作的知识。在这里我们做一个最基本的案例:用户登录二、
- 本文实例讲述了Python实现的爬取小说爬虫功能。分享给大家供大家参考,具体如下:想把顶点小说网上的一篇持续更新的小说下下来,就写了一个简单
- alert table 表名 add column 列名 alter table 表名 drop column 列名 eg: alter t
- 前言在日常开发中,客户端上传文件的一般流程是:客户端向服务端发送文件,再由服务端将文件转储到专门的存储服务器或云计算厂商的储存服务(例如阿里
- 本文实例讲述了Laravel框架实现定时发布任务的方法。分享给大家供大家参考,具体如下:背景:需要每隔一小时新建一个任务http://lar
- 需求:查询进行中的活动数据进行中一共有以下几种情况:1.开始时间为空,结束时间为空, 此结果数据将永远为进行中的数据2.开始时间为空,结束时
- 在做JS开发时,我们将第三方复杂的插件进行封装,然后对外公开一个很简单的方法接口,这是开发时常用的方法,在JS里,我们的方法参数通常使用JQ
- Flask-SQLAlchemy安装和建表操作请参考这里。 # Role表class Role(db.Model):
- [Hack] 意为”劈”、”砍”。 [Hacker] 意为”黑客”CSS Hack 是指针对不同的浏览器写不同的CSS code的过程,简单
- 工作中常常会创建一个函数来解决一些需求问题,以下是个人在工作中总结出来的创建函数20种方式,你知道多少?function sayHello(