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 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
_.Switch30 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
阿_旭1 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
Power20246662 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
YRr YRr3 小时前
深度学习:循环神经网络(RNN)详解
人工智能·rnn·深度学习
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
红客5973 小时前
Transformer和BERT的区别
深度学习·bert·transformer
多吃轻食3 小时前
大模型微调技术 --> 脉络
人工智能·深度学习·神经网络·自然语言处理·embedding