Pytorch中实例化模型和调用模型时传的参数

今日用ai写代码的时候发现自己对Pytorch中实例化模型和调用模型时传的参数没搞清楚,故记录一下,假设有以下代码:

import torch
import torch.nn as nn
from torchvision.models import mobilenet_v3_large

class FusionIQAModel(nn.Module):
    def __init__(self, num_outputs=1):
        super(FusionIQAModel, self).__init__()
        self.mobilenet = mobilenet_v3_large(pretrained=True)
        self.mobilenet.classifier[3] = nn.Linear(self.mobilenet.classifier[3].in_features, 1280)
        
        # 新增一层来结合传统特征
        self.fc1 = nn.Linear(1280 + 5, 512)
        self.fc2 = nn.Linear(512, num_outputs)
        self.relu = nn.ReLU()

    def forward(self, x, traditional_features):
        x = self.mobilenet.features(x)
        x = self.mobilenet.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.mobilenet.classifier[0](x)
        x = self.mobilenet.classifier[1](x)
        x = self.mobilenet.classifier[2](x)
        x = self.mobilenet.classifier[3](x)  # 1280维特征
        
        # 结合传统特征
        combined_features = torch.cat((x, traditional_features), dim=1)  # 1285维特征
        x = self.relu(self.fc1(combined_features))
        x = self.fc2(x)
        return x

# 实例化模型
model = FusionIQAModel(num_outputs=1)

# 生成一些示例数据
images = torch.randn(8, 3, 224, 224)  # 假设有8张3通道224x224的图像
traditional_features = torch.randn(8, 5)  # 假设每张图像有5个传统特征

# 调用模型,进行前向传播
outputs = model(images, traditional_features)

print(outputs)

我在实例化这个模型时用的是model = FusionIQAModel(num_outputs=1),此时传入的参数是__init__方法中的参数,而我在调用这个模型是用的是outputs = model(images, traditional_features),此时传入的参数是forward里的参数。
在PyTorch中,这个机制是通过__call__方法实现的。当你调用一个nn.Module的实例时,实际上是调用了它的__call__方法,而这个方法会自动调用你在子类中定义的forward方法。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值