移除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
相关产品推荐
相关产品推荐

