Pytorch 中怎样才能正确编写 forward( ) 函数

本文介绍了在Pytorch中遇到'object is not callable'和'object has no attribute _backward_hooks'错误的原因及解决方法。关键在于确保类继承自torch.nn.Module并在__init__中调用super()。总结了成功定义forward函数的两个要点,并提供了两个示例,展示了只有forward()和forward()与__call__()同时存在时的区别。
摘要由CSDN通过智能技术生成

1 问题描述

在学习 Pytorch 中我们知道, 在有 forward( ) 方法的函数, 可以通过直接实例化后, 通过 实例化( ) 的方法直接调用 forward( ) 函数, 但是却遇到了报错 :

  • 'test' object is not callable

  • 'test' object has no attribute '_backward_hooks'

下面来解释原因


2 解决方法

2.1 'test' object is not callable

出现这个问题是因为在创建 class 时, 没有继承 torch.nn.Module

2.2 test' object has no attribute '_backward_hooks'

这个问题是, 在继承 torch.nn.Module 后, 没有在 __init__ 方法中, super(自己) 去继承父类的方

无交叉分位数损失函数(Quantile Loss)用来评估预测结果的分位数精度,通常用于回归问题。在PyTorch,可以使用以下代码实现无交叉分位数损失函数: ```python import torch def quantile_loss(y_pred, y_true, quantiles): """ 无交叉分位数损失函数 :param y_pred: 预测值张量,shape为(batch_size, num_quantiles) :param y_true: 真实值张量,shape为(batch_size,) :param quantiles: 分位数列表,如[0.1, 0.5, 0.9] :return: 无交叉分位数损失值 """ batch_size = y_true.shape[0] num_quantiles = len(quantiles) # 将真实值张量扩展为(batch_size, num_quantiles)的形状 y_true = y_true.view(batch_size, 1).expand(batch_size, num_quantiles) # 计算分位数上限和下限 errors = y_true - y_pred losses = torch.max((quantiles - 1) * errors, quantiles * errors) # 对每个样本的损失值进行求和,再取平均值 loss = torch.mean(torch.sum(losses, dim=1)) return loss ``` 其,y_pred是预测值张量,shape为(batch_size, num_quantiles),表示每个样本在不同分位数下的预测值;y_true是真实值张量,shape为(batch_size,),表示每个样本的真实值;quantiles是分位数列表,如[0.1, 0.5, 0.9],表示要计算的分位数。 在使用该损失函数时,可以先将模型输出的张量通过softmax函数转换为概率分布,再根据分位数计算预测值。具体实现如下: ```python import torch.nn.functional as F class QuantileRegression(torch.nn.Module): """ 无交叉分位数回归模型 """ def __init__(self, num_features, num_quantiles): super().__init__() self.num_quantiles = num_quantiles self.fc1 = torch.nn.Linear(num_features, 128) self.fc2 = torch.nn.Linear(128, num_quantiles) def forward(self, x): x = F.relu(self.fc1(x)) x = self.fc2(x) # 将模型输出的张量通过softmax函数转换为概率分布 x = F.softmax(x, dim=1) # 根据分位数计算预测值 quantiles = torch.tensor([float(i) / (self.num_quantiles - 1) for i in range(self.num_quantiles)]) y_pred = torch.sum(x * quantiles, dim=1) return y_pred model = QuantileRegression(num_features, num_quantiles) optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): for i, (x, y_true) in enumerate(train_loader): optimizer.zero_grad() y_pred = model(x) loss = quantile_loss(y_pred, y_true, quantiles) loss.backward() optimizer.step() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值