zoukankan      html  css  js  c++  java
  • pytorch对权重文件(model.pth / model.weights)的处理方式

    pytorch 打印模型层的名字的多个方式,以及对应显示,删除最后多个层的两种方式

        def forward(self, x, last_cont=None):
            x = self.model(x)
            if self.use_dcl:
                mask = self.Convmask(x)
                mask = self.avgpool2(mask)
                mask = torch.tanh(mask)
                mask = mask.view(mask.size(0), -1)
    
            x = self.avgpool(x)
            x = x.view(x.size(0), -1)
            out = []
            out.append(self.classifier(x))
    
            if self.use_dcl:
                out.append(self.classifier_swap(x))
                out.append(mask)
    

      


    1、 for name, module in model._modules.items():
    print (name," : ",module)
    这里的名字模型定义的时候,前向传播的一个大块,每个大块里面的是多个小块包含在module中

        for name, module in model._modules.items():
            print (name," : ",module)
        print ("**********")
        for name, module in model._modules.items():
            print (name)
    打印##################################
          (relu): ReLU(inplace)
          (se_module): SEModule(
            (avg_pool): AdaptiveAvgPool2d(output_size=1)
            (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))
            (relu): ReLU(inplace)
            (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))
            (sigmoid): Sigmoid()
          )
        )
      )
    )
    avgpool  :  AdaptiveAvgPool2d(output_size=1)
    classifier  :  Linear(in_features=2048, out_features=402, bias=False)
    classifier_swap  :  Linear(in_features=2048, out_features=804, bias=False)
    Convmask  :  Conv2d(2048, 1, kernel_size=(1, 1), stride=(1, 1))
    avgpool2  :  AvgPool2d(kernel_size=2, stride=2, padding=0)
    **********
    model
    avgpool
    classifier
    classifier_swap
    Convmask
    avgpool2
          
    

      


    1、 for n in model.named_modules():
    print (n)



    打印是一个元组,层的名字和对应的类型:
    ...
    ('model.4.2.se_module.avg_pool', AdaptiveAvgPool2d(output_size=1))
    ('model.4.2.se_module.fc1', Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1)))
    ('model.4.2.se_module.relu', ReLU(inplace))
    ('model.4.2.se_module.fc2', Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1)))
    ('model.4.2.se_module.sigmoid', Sigmoid())
    ('avgpool', AdaptiveAvgPool2d(output_size=1))
    ('classifier', Linear(in_features=2048, out_features=402, bias=False))
    ('classifier_swap', Linear(in_features=2048, out_features=804, bias=False))
    ('Convmask', Conv2d(2048, 1, kernel_size=(1, 1), stride=(1, 1)))
    ('avgpool2', AvgPool2d(kernel_size=2, stride=2, padding=0))
    

      


    2、 for n in (model.children()):
    print (n)
    打印的是所有层的类型,以及对应输入输出维度,参数

        (2): SEResNetBottleneck(
          (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace)
          (se_module): SEModule(
            (avg_pool): AdaptiveAvgPool2d(output_size=1)
            (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))
            (relu): ReLU(inplace)
            (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))
            (sigmoid): Sigmoid()
          )
        )
      )
    )
    AdaptiveAvgPool2d(output_size=1)
    Linear(in_features=2048, out_features=402, bias=False)
    Linear(in_features=2048, out_features=804, bias=False)
    Conv2d(2048, 1, kernel_size=(1, 1), stride=(1, 1))
    AvgPool2d(kernel_size=2, stride=2, padding=0)
    

      


    3、 for n in (model.modules()):
    print (n)

      (se_module): SEModule(
        (avg_pool): AdaptiveAvgPool2d(output_size=1)
        (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))
        (relu): ReLU(inplace)
        (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))
        (sigmoid): Sigmoid()
      )
    )
    Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
    BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
    BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
    BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    ReLU(inplace)
    SEModule(
      (avg_pool): AdaptiveAvgPool2d(output_size=1)
      (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))
      (relu): ReLU(inplace)
      (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))
      (sigmoid): Sigmoid()
    )
    AdaptiveAvgPool2d(output_size=1)
    Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))
    ReLU(inplace)
    Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))
    Sigmoid()
    AdaptiveAvgPool2d(output_size=1)
    Linear(in_features=2048, out_features=402, bias=False)
    Linear(in_features=2048, out_features=804, bias=False)
    Conv2d(2048, 1, kernel_size=(1, 1), stride=(1, 1))
    AvgPool2d(kernel_size=2, stride=2, padding=0)
    

      


    4、 for ind,i in model.state_dict().items():
    print (ind,i.shape)
    打印的是权重的层的名字和对应形状,顺序可能不是对的

    model.4.2.bn1.num_batches_tracked torch.Size([])
    model.4.2.conv2.weight torch.Size([512, 512, 3, 3])
    model.4.2.bn2.weight torch.Size([512])
    model.4.2.bn2.bias torch.Size([512])
    model.4.2.bn2.running_mean torch.Size([512])
    model.4.2.bn2.running_var torch.Size([512])
    model.4.2.bn2.num_batches_tracked torch.Size([])
    model.4.2.conv3.weight torch.Size([2048, 512, 1, 1])
    model.4.2.bn3.weight torch.Size([2048])
    model.4.2.bn3.bias torch.Size([2048])
    model.4.2.bn3.running_mean torch.Size([2048])
    model.4.2.bn3.running_var torch.Size([2048])
    model.4.2.bn3.num_batches_tracked torch.Size([])
    model.4.2.se_module.fc1.weight torch.Size([128, 2048, 1, 1])
    model.4.2.se_module.fc1.bias torch.Size([128])
    model.4.2.se_module.fc2.weight torch.Size([2048, 128, 1, 1])
    model.4.2.se_module.fc2.bias torch.Size([2048])
    classifier.weight torch.Size([402, 2048])
    classifier_swap.weight torch.Size([804, 2048])
    Convmask.weight torch.Size([1, 2048, 1, 1])
    Convmask.bias torch.Size([1])
    

      


    module 和 children返回的区别,mododule更多


    最后删除层的方式两种

    #resnet = models.resnet50(pretrained=True)
    modules = list(model.children())[:-4] # #删除最后四个个层 【-1】删除最后一个层
    model = torch.nn.Sequential(*modules)
    

      


    这种方式最后的层的名字会变成数字

    (‘model.4.2.se_module.relu’, ReLU(inplace)) 会变成(‘0.4.2.se_module.relu’, ReLU(inplace))
    (‘avgpool’, AdaptiveAvgPool2d(output_size=1))会变成(‘1’, AdaptiveAvgPool2d(output_size=1))
    model>>0
    avgpool>>1
    把名字的 点 的第一个名字变成数字,没有点就是整体的名字变成数字

    。。。。
    ('0.4.2.se_module.relu', ReLU(inplace))
    ('0.4.2.se_module.fc2', Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1)))
    ('0.4.2.se_module.sigmoid', Sigmoid())
    ('1', AdaptiveAvgPool2d(output_size=1))
    ('2', Linear(in_features=2048, out_features=402, bias=False))
    ('3', Linear(in_features=2048, out_features=804, bias=False))
    ('4', Conv2d(2048, 1, kernel_size=(1, 1), stride=(1, 1)))
    
    ####原来是按照模型结构定义的名字
    ('model.4.2.se_module.relu', ReLU(inplace))
    ('model.4.2.se_module.fc2', Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1)))
    ('model.4.2.se_module.sigmoid', Sigmoid())
    ('avgpool', AdaptiveAvgPool2d(output_size=1))
    ('classifier', Linear(in_features=2048, out_features=402, bias=False))
    ('classifier_swap', Linear(in_features=2048, out_features=804, bias=False))
    ('Convmask', Conv2d(2048, 1, kernel_size=(1, 1), stride=(1, 1)))
    ('avgpool2', AvgPool2d(kernel_size=2, stride=2, padding=0))
    

      

    方法2打印模型名字,不改变其他层名字

        # del model.classifier
        # del model.classifier_swap
        # del model.Convmask
        # del model.avgpool2
    直接对模型进行del ,不知道名字,先打印,名字,然后直接删除
     for n in model.named_modules():
            print (n)
    

      


    ————————————————
    版权声明:本文为CSDN博主「shishi_m037192554」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/m0_37192554/article/details/104003947




    如果这篇文章帮助到了你,你可以请作者喝一杯咖啡

  • 相关阅读:
    看从小自带BUFF的他,如何用代码降低万物互联的门槛
    30亿参数,华为云发布全球最大预训练模型,开启工业化AI开发新模式
    6大新品重磅发布,华为云全栈云原生技术能力持续创新升级
    ISO/IEC 5055:软件代码质量的标尺
    Python基础语法和数据类型最全总结
    40个问题让你快速掌握Java多线程的精髓
    编程实战:如何管理代码里的常量
    总是记不住java的IO流用法?用N个问题教你掌握java IO流
    4种语义分割数据集Cityscapes上SOTA方法总结
    PHP 在Swoole中使用双IoC容器实现无污染的依赖注入
  • 原文地址:https://www.cnblogs.com/sddai/p/14948795.html
Copyright © 2011-2022 走看看