pytorch修改ConvNeXt-T网络

使用迁移学习,修改ConvNeXt-T网络,对特征进行融合

python 复制代码
import torch
import torch.nn as nn
import torchvision.models as models


class CustomConvNeXtT(nn.Module):
    def __init__(self, in_channels=3, num_classes=2, chunk=2, csv_shape=107, CSV=True):
        super(CustomConvNeXtT, self).__init__()
        self.chunk = chunk
        self.num_classes = num_classes
        self.CSV = CSV

        # 加载预训练的ConvNeXt-Tiny模型
        convnext = models.convnext_tiny(pretrained=True)

        # 冻结预训练模型的所有参数
        for name, param in convnext.named_parameters():
            param.requires_grad = False

        # 将修改后的模型赋值给自定义的ConvNeXt-T网络
        self.model = convnext

        # 修改第一个卷积层的输入通道数
        self.model.features[0][0] = nn.Conv2d(in_channels, 96, kernel_size=4, stride=4)

        # 获取特征提取器的输出特征维度
        num_ftrs = self.model.classifier[2].in_features

        # 修改分类头部
        self.model.classifier = nn.Sequential(
            nn.LayerNorm(num_ftrs * self.chunk + (csv_shape if CSV else 0), eps=1e-6, elementwise_affine=True),
            nn.Linear(num_ftrs * self.chunk + (csv_shape if CSV else 0), num_classes)
        )

    def extract_features(self, x):
        x = self.model.features(x)
        x = self.model.avgpool(x)
        x = torch.flatten(x, 1)
        return x

    def forward(self, data_DCE, data_T2, csv):
        data_DCE = self.extract_features(data_DCE)
        data_T2 = self.extract_features(data_T2)

        if not self.CSV:
            csv = torch.ones_like(csv)

        x = torch.cat((data_DCE, data_T2, csv), dim=1)
        print(f"Feature size after concatenation: {x.size()}")  # 打印特征拼接后的尺寸

        output = self.model.classifier(x)
        return output


if __name__ == '__main__':
    net = CustomConvNeXtT(in_channels=3, num_classes=2, chunk=2, csv_shape=107, CSV=True)
    for name, param in net.named_parameters():
        print(name, ":", param.requires_grad)

    data_DCE = torch.randn(64, 3, 224, 224)
    data_T2 = torch.randn(64, 3, 224, 224)
    csv = torch.randn(64, 107)

    output = net(data_DCE, data_T2, csv)
    print("输出特征尺寸:", output.size())
相关推荐
哥布林学者5 分钟前
吴恩达深度学习课程五:自然语言处理 第三周:序列模型与注意力机制(四)语音识别和触发字检测
深度学习·ai
放飞自我的Coder24 分钟前
【PDF拆分 Python拆分左右并排PDF】
python·pdf
nimadan121 小时前
**AI漫剧爆款生成器2025推荐,解锁高互动率与平台适配的
人工智能·python
2401_857683541 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
luoluoal1 小时前
基于opencv的疲劳检测系统(源码+文档)
python·mysql·django·毕业设计·源码
m0_706653231 小时前
使用Python自动收发邮件
jvm·数据库·python
程序员杰哥1 小时前
Chrome浏览器+Postman做接口测试
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
ZCXZ12385296a1 小时前
YOLO11-ASF-P2模型实现蚕桑业健康状态识别完整教程
python
gang_unerry1 小时前
量子退火与机器学习(4): 大模型 1-bit 量子化中的 QEP 与 QQA 准量子退火技术
人工智能·python·机器学习·量子计算