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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM