首页 > 编程语言 >python中`__call__`让类像函数一样被调用

python中`__call__`让类像函数一样被调用

时间:2024-03-19 11:14:29浏览次数:27  
标签:__ loss 调用 python call forward data

在训练一个网络过程中,有下面代码

'''4.训练网络'''
print('开始训练')
for epoch in range(3):
    runing_loss = 0.0

    for i, data in enumerate(trainloader, 0):
        inputs, label = data  # 1.数据加载
        if device == 'gpu':
            inputs = inputs.cuda()
            label = label.cuda()
        optimizer.zero_grad()  # 2.初始化梯度
        output = Net(inputs)  # 3.计算前馈
        loss = criterion(output, label)  # 4.计算损失
        loss.backward()  # 5.计算梯度
        optimizer.step()  # 6.更新权值

        runing_loss += loss.item()
        if i % 20 == 19:
            print('epoch:', epoch, 'loss', runing_loss / 20)
            runing_loss = 0.0

print('训练完成')

发现在第三步计算前馈过程中output = Net(inputs)没有调用forward()方法,这是为什么?

以下参考Pytorch 模型中nn.Model 中的forward() 前向传播不调用 解释

在pytorch 中没有调用模型的forward()前向传播,只实列化后把参数传入。

class Module(nn.Module):
    def __init__(self):
        super(Module, self).__init__()
        # ......

    def forward(self, x):
        # ......
        return x

data = .....  #输入数据
# 实例化一个对象
module = Module()
#  前向传播 直接把输入传入实列化
module(data)  
#没有使用module.forward(data)

实际上module(data) 等价于module.forward(data)

等价的原因是因为 python calss 中的__call__ 可以让类像函数一样调用

当执行model(x)的时候,底层自动调用forward方法计算结果

class A():
    def __call__(self):
        print('i can be called like a function')
 
a = A()
a()
>>>i can be called like a function

在__call__ 里可调用其它的函数

class A():
    def __call__(self, param):

        print('我在__call__中,传入参数',param)

        res = self.forward(param) # <<<<<<<<<<<<<<<< 注意这里
        return res

    def forward(self, x):
        print('我在forward函数中,传入参数类型是值为: ',x)
        return x

a = A()
y = a('i')
#  >>> 我在__call__中,传入参数 i
#  >>>我在forward函数中,传入参数类型是值为:  i

print("传入的参数是:", y)
#  >>>传入的参数是: i

Reference

Pytorch 模型中nn.Model 中的forward() 前向传播不调用 解释

标签:__,loss,调用,python,call,forward,data
From: https://www.cnblogs.com/guanghui-hua/p/18082298

相关文章

  • IDE-使用阿里云-通义灵码
    什么是通义灵码?通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云的云服务使用场景调优,助力开发者高效、流畅的编码。......
  • 微信小程序(插槽)
        ......
  • element plus DateTimePicker控件选择日期不选时间,默认是0点,但是获取到的时间不一致
    只选择日期,未选择时间,应默认是0点 保存入库后时间变为16点 查看官方文档后,给控件设置这个属性即可value-format="YYYY-MM-DDHH:mm:ss" ......
  • 在项目中,把vcpkg作为子模块使用
    1.使用git创建版本库2.进入目录中,使用git命令行工具克隆gitsubmoduleaddhttps://github.com/microsoft/vcpkg.gitvcpkg   3.进入vcpkg目录执行  bootstrap-vcpkg.bat批处理文件4.进入项目目录运行cmd命令执行  vcpkg\vcpkgnew--application  添加json......
  • 前端传list集合,后端接收
    一、前端列表多选<el-tableref="multipleTable":data="tableData"stripestyle="width:99%;margin-bottom:10px;":height="$publicjs.tableHeight"@se......
  • Spring Data Elasticsearch 自定义检索字段比重,计算得分
    BoolQueryBuilderfuzzyQuery=QueryBuilders.boolQuery();String[]matchFieldNames={"itemName","categoryNames","baseCategoryName","materialNameAilas","materialName",......
  • 泛型委托 Action、Func
    委托在使用的时候有三个步骤:1、定义委托2、实例化委托3、执行委托每次使用委托,我们都需要定义委托,非常麻烦。C#已经内置了一些委托给我们使用,无需再重新定义。一、Action委托(无返回委托)1、Action无参无返回2、Action一个参数3、Action<T1,,,,,,,,,,,,T16>最多支持16......
  • QSignalMapper的使用和使用场景
    QSignalMapper的使用和使用场景 目录QSignalMapper的使用和使用场景常见场景下面是参考。可看可不看这篇写的不错,搬运为Markdown了可以看一下参考 QSignalMapper的使用和使用场景QSignalMapper类收集了一系列的无参信号,然后使用相对于信号发送者来说的整数......
  • CC2530 中的ZigBee协议栈
    ###CC2530中得ZigBee协议栈1.何为协议栈ZigBee协议栈将各个层的协议集合在一起,并以函数的形式实现,并且向用户提供接口,用户能够直接调用。它本身就为一个工程。2.如何使用开始组网,通过调用协议栈的组网函数等来实现网络的建立以及其他节点的加入网络;发送数据,节点通过调用......
  • vue el-image 显示图片
    一、前端图片<el-form-itemlabel="案件文件"><el-imagefit="contain"v-for="(item,index)offileList":key="index":src="item.url":preview-src-list="getImgList(index)"style="......