You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除GAT模块使用ResNet18?解决输出与目标尺寸不匹配问题

问题修复方案

报错核心原因:移除GAT后,当前模型输出512维特征向量(形状[64,512]),但训练标签是1维二分类标签(形状[64,1]),维度不匹配。原模型中GAT负责将ResNet的空间特征转换为1维二分类概率,现在需要用全连接层替代这个映射逻辑。

修改步骤及代码

1. 关键修改点

  • 新增全连接层,把512维特征映射为1维输出,对齐标签维度。
  • 保留原模型的ResNet预训练+参数冻结逻辑,避免训练量过大、对齐原性能基线。
  • 最后应用sigmoid函数输出二分类概率,和原模型输出逻辑一致。

2. 修改后的完整代码

import torch
import torch.nn as nn
from torchvision.models.resnet import ResNet, BasicBlock

class AntispoofModel(nn.Module):    
    def __init__(self, device="cpu", **kwargs):
        super().__init__()
        # 加载预训练ResNet18,对齐原模型逻辑
        resnet = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)
        # 拆分ResNet结构,保留到layer4(对应原模型的[:-2],去掉avgpool和fc)
        self.conv1 = resnet.conv1
        self.bn1 = resnet.bn1
        self.relu = resnet.relu
        self.maxpool = resnet.maxpool
        self.layer1 = resnet.layer1
        self.layer2 = resnet.layer2
        self.layer3 = resnet.layer3
        self.layer4 = resnet.layer4
        self.avgpool = nn.AdaptiveAvgPool2d(output_size=1)
        
        # 添加全连接层,将512维特征映射为1维输出
        self.fc = nn.Linear(512, 1).to(device)
        
        # 冻结ResNet参数,和原模型一致
        for param in list(self.conv1.parameters()) + list(self.bn1.parameters()) + \
                     list(self.layer1.parameters()) + list(self.layer2.parameters()) + \
                     list(self.layer3.parameters()) + list(self.layer4.parameters()):
            param.requires_grad = False
            
        self.device = device
        
    def forward(self, x):
        x = x.to(self.device)
        feature = self.conv1(x)
        feature = self.bn1(feature)
        feature = self.relu(feature)
        feature = self.maxpool(feature)
        feature = self.layer1(feature)
        feature = self.layer2(feature)
        feature = self.layer3(feature)
        feature = self.layer4(feature)
        out = self.avgpool(feature)  # shape: [batch_size, 512, 1, 1]
        out = out.view(out.size(0), -1)  # shape: [batch_size, 512]
        out = self.fc(out)  # shape: [batch_size, 1]
        return torch.sigmoid(out)  # 输出二分类概率,对齐原模型

3. 补充说明

  • 原模型ResNet采用预训练+冻结参数的方式,修改后保留该逻辑,避免从头训练ResNet带来的计算开销和性能波动。
  • 全连接层nn.Linear(512,1)完全替代原GAT的最终输出映射功能,确保输出维度与标签匹配。
  • 保留sigmoid函数输出0-1区间的概率值,和原模型输出形式一致,无需调整损失函数调用逻辑。

内容的提问来源于stack exchange,提问作者123321

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:45:31