Pytorch中间某一层权重

Pytorch中间某一层权重

  • 问题描述
  • 解决办法


问题描述

训练好的网络模型想知道中间某一层的权重或者看看中间某一层的特征,如何处理呢?

解决办法

获取某一层权重,并保存到excel中

import torch
from torch import nn
import torch.nn.functional as F
import torchvision.models as models
import pandas as pd

resnet18 = models.resnet18(pretrained=True)

parm = {}
for name,parameters in resnet18.named_parameters():
    print(name,':',parameters.size())
    parm[name]=parameters.detach().numpy()

上述代码将每个模块参数存入parm字典中,parameters.detach().numpy()将tensor类型变量转换成numpy array形式,方便后续存储到表格中。输出为:

conv1.weight : torch.Size([64, 3, 7, 7])
bn1.weight : torch.Size([64])
bn1.bias : torch.Size([64])
layer1.0.conv1.weight : torch.Size([64, 64, 3, 3])
layer1.0.bn1.weight : torch.Size([64])
layer1.0.bn1.bias : torch.Size([64])
layer1.0.conv2.weight : torch.Size([64, 64, 3, 3])
layer1.0.bn2.weight : torch.Size([64])
layer1.0.bn2.bias : torch.Size([64])
layer1.1.conv1.weight : torch.Size([64, 64, 3, 3])
layer1.1.bn1.weight : torch.Size([64])
layer1.1.bn1.bias : torch.Size([64])
layer1.1.conv2.weight : torch.Size([64, 64, 3, 3])
layer1.1.bn2.weight : torch.Size([64])
layer1.1.bn2.bias : torch.Size([64])
layer2.0.conv1.weight : torch.Size([128, 64, 3, 3])
layer2.0.bn1.weight : torch.Size([128])
layer2.0.bn1.bias : torch.Size([128])
layer2.0.conv2.weight : torch.Size([128, 128, 3, 3])
layer2.0.bn2.weight : torch.Size([128])
layer2.0.bn2.bias : torch.Size([128])
layer2.0.downsample.0.weight : torch.Size([128, 64, 1, 1])
layer2.0.downsample.1.weight : torch.Size([128])
layer2.0.downsample.1.bias : torch.Size([128])
layer2.1.conv1.weight : torch.Size([128, 128, 3, 3])
layer2.1.bn1.weight : torch.Size([128])
layer2.1.bn1.bias : torch.Size([128])
layer2.1.conv2.weight : torch.Size([128, 128, 3, 3])
layer2.1.bn2.weight : torch.Size([128])
layer2.1.bn2.bias : torch.Size([128])
layer3.0.conv1.weight : torch.Size([256, 128, 3, 3])
layer3.0.bn1.weight : torch.Size([256])
layer3.0.bn1.bias : torch.Size([256])
layer3.0.conv2.weight : torch.Size([256, 256, 3, 3])
layer3.0.bn2.weight : torch.Size([256])
layer3.0.bn2.bias : torch.Size([256])
layer3.0.downsample.0.weight : torch.Size([256, 128, 1, 1])
layer3.0.downsample.1.weight : torch.Size([256])
layer3.0.downsample.1.bias : torch.Size([256])
layer3.1.conv1.weight : torch.Size([256, 256, 3, 3])
layer3.1.bn1.weight : torch.Size([256])
layer3.1.bn1.bias : torch.Size([256])
layer3.1.conv2.weight : torch.Size([256, 256, 3, 3])
layer3.1.bn2.weight : torch.Size([256])
layer3.1.bn2.bias : torch.Size([256])
layer4.0.conv1.weight : torch.Size([512, 256, 3, 3])
layer4.0.bn1.weight : torch.Size([512])
layer4.0.bn1.bias : torch.Size([512])
layer4.0.conv2.weight : torch.Size([512, 512, 3, 3])
layer4.0.bn2.weight : torch.Size([512])
layer4.0.bn2.bias : torch.Size([512])
layer4.0.downsample.0.weight : torch.Size([512, 256, 1, 1])
layer4.0.downsample.1.weight : torch.Size([512])
layer4.0.downsample.1.bias : torch.Size([512])
layer4.1.conv1.weight : torch.Size([512, 512, 3, 3])
layer4.1.bn1.weight : torch.Size([512])
layer4.1.bn1.bias : torch.Size([512])
layer4.1.conv2.weight : torch.Size([512, 512, 3, 3])
layer4.1.bn2.weight : torch.Size([512])
layer4.1.bn2.bias : torch.Size([512])
fc.weight : torch.Size([1000, 512])
fc.bias : torch.Size([1000])

查看某一层的结果:

layer1 = parm['layer1.0.conv1.weight'][0,0,:,:]
print('layer1.0.conv1.weight:\n',layer1)

Pytorch中间某一层权重_第1张图片
利用如下函数将某一层的所有参数保存到表格中:

def parm_to_excel(excel_name,key_name,parm):
    with pd.ExcelWriter(excel_name) as writer:
        [output_num,input_num,filter_size,_] = parm[key_name].size()
        for i in range(output_num):
            for j in range(input_num):
                data = pd.DataFrame(parm[key_name][i,j,:,:].detach().numpy())
                print(data)
                data.to_excel(writer,index=False,header=True,startow=i*(filter_size+1),startcol=j*filter_sizeer_)

#由于权重矩阵中有很多的值非常小,取出固定大小的值,并将全部权重写入excel
counter = 1
with pd.ExcelWriter('weights.xlsx') as writer:
    for key in parm.keys():
        data = parm[key].reshape(-1, 1)
        data = data[data > 0.001]

        data = pd.DataFrame(data, columns=[key])
        data.to_excel(writer, index=False, startcol=counter)
        counter += 1

结果部分截图如下:
Pytorch中间某一层权重_第2张图片
完成代码

import torch
from torch import nn
import torch.nn.functional as F
import torchvision.models as models
import pandas as pd

resnet18 = models.resnet18(pretrained=True)

parm = {}
for name,parameters in resnet18.named_parameters():
    print(name,':',parameters.size())
    parm[name]=parameters.detach().numpy()
#
#
#查看某一层的结果
print('**********************************')
layer1 = parm['layer1.0.conv1.weight'][0,0,:,:]
print('layer1.0.conv1.weight:\n',layer1)


#利用如下函数将某一层的所有参数保存到表格中
def parm_to_excel(excel_name,key_name,parm):
    with pd.ExcelWriter(excel_name) as writer:
        [output_num,input_num,filter_size,_] = parm[key_name].size()
        for i in range(output_num):
            for j in range(input_num):
                data = pd.DataFrame(parm[key_name][i,j,:,:].detach().numpy())
                print(data)
                data.to_excel(writer,index=False,header=True,startow=i*(filter_size+1),startcol=j*filter_sizeer_)

#由于权重矩阵中有很多的值非常小,取出固定大小的值,并将全部权重写入excel
counter = 1
with pd.ExcelWriter('weights.xlsx') as writer:
    for key in parm.keys():
        data = parm[key].reshape(-1, 1)
        data = data[data > 0.001]

        data = pd.DataFrame(data, columns=[key])
        data.to_excel(writer, index=False, startcol=counter)
        counter += 1
print('**********************************')


参考链接:https://www.jb51.net/article/167879.htm

你可能感兴趣的:(学习笔记,pytorch,深度学习,人工智能)