‘Sequential’ object has no attribute ‘xxx‘——基于医学图像分类算法研究(二)

前言:目前再做医学图像分类算法的项目,我们之前用了一些基本的模型去跑,例如resnet,densenet,efficientnet等。现在我们需要使用transformer模型,但是在测试的时候出现了如下图的错误,显示某个模块中没有某个属性,其实这是个常见错误。

看到这个大家先不要慌,没有这个属性,说明是模型中没有匹配代码中的属性,这个时候要找到对应的定义model的类。我在这里测试了vit(vision transformer),deit(data efficient image transformer),st(swin-transformer)的基准型base,在测试这3个的时候都要修改对应的连接层或属性以适应该类别的任务。

原来的代码是这样的,就会出现上述类似错误

class SELFMODEL(nn.Module):
    def __init__(self, model_name=params['model'], out_features=params['num_classes'],
                 pretrained=True):
        super().__init__()
        self.model = timm.create_model(model_name, pretrained=pretrained)  # 从预训练的库中加载模型
        
        # 根据模型名称修改分类器层
        if model_name[:3] == "res":
            n_features = self.model.fc.in_features
            self.model.fc = nn.Linear(n_features, out_features)
        elif model_name[:3] == "vit":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
        elif model_name[:4] == "swin":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
        elif model_name[:4] == "deit":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
        elif model_name[:8] == "convnext":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
            else:
                raise ValueError("ConvNeXt model does not have the expected 'head.fc' structure")
        else:
            n_features = self.model.classifier.in_features
            self.model.classifier = nn.Linear(n_features, out_features)
        
        # 打印模型结构
        print(self.model)

模型的头部(head)是一个 Sequential 容器,其中包含一个或多个层,最后的 Linear 层用于分类。我们需要正确地访问这个 Linear 层并替换它。

修改之后就可以使用了,代码如下图所示

class SELFMODEL(nn.Module):
    def __init__(self, model_name=params['model'], out_features=params['num_classes'],
                 pretrained=True):
        super().__init__()
        self.model = timm.create_model(model_name, pretrained=pretrained)  # 从预训练的库中加载模型
        
        # 根据模型名称修改分类器层
        if model_name[:3] == "res":
            n_features = self.model.fc.in_features
            self.model.fc = nn.Linear(n_features, out_features)
        elif model_name[:3] == "vit":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
        elif model_name[:4] == "swin":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
        elif model_name[:4] == "deit":
            n_features = self.model.head.in_features
            self.model.head = nn.Linear(n_features, out_features)
        elif model_name[:8] == "convnext":
            # ConvNeXt 的 head 是一个 Sequential 容器,其中包含一个名为 fc 的 Linear 层
            if hasattr(self.model, 'head') and hasattr(self.model.head, 'fc'):
                n_features = self.model.head.fc.in_features
                self.model.head.fc = nn.Linear(n_features, out_features)
            else:
                raise ValueError("ConvNeXt model does not have the expected 'head.fc' structure")
        else:
            n_features = self.model.classifier.in_features
            self.model.classifier = nn.Linear(n_features, out_features)
        
        # 打印模型结构
        print(self.model)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值