时间:2021-05-22
在用pdb debug的时候,有时候需要看一下特定layer的权重以及相应的梯度信息,如何查看呢?
1. 首先把你的模型打印出来,像这样
2. 然后观察到model下面有module的key,module下面有features的key, features下面有(0)的key,这样就可以直接打印出weight了,在pdb debug界面输入p model.module.features[0].weight,就可以看到weight,输入 p model.module.features[0].weight.grad就可以查看梯度信息
补充知识:查看Pytorch网络的各层输出(feature map)、权重(weight)、偏置(bias)
BatchNorm2d参数量
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)# 卷积层中卷积核的数量C num_features – C from an expected input of size (N, C, H, W)>>> import torch>>> m = torch.nn.BatchNorm2d(100)>>> m.weight.shapetorch.Size([100])>>> m.numel()AttributeError: 'BatchNorm2d' object has no attribute 'numel'>>> m.weight.numel()100>>> m.parameters().numel()Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'generator' object has no attribute 'numel'>>> [p.numel() for p in m.parameters()][100, 100]linear层
>>> import torch>>> m1 = torch.nn.Linear(100,10)# 参数数量= (输入神经元+1)*输出神经元>>> m1.weight.shapetorch.Size([10, 100])>>> m1.bias.shapetorch.Size([10])>>> m1.bias.numel()10>>> m1.weight.numel()1000>>> m11 = list(m1.parameters())>>> m11[0].shape# weighttorch.Size([10, 100])>>> m11[1].shape# biastorch.Size([10])weight and bias
# Method 1 查看Parameters的方式多样化,直接访问即可model = alexnet(pretrained=True).to(device)conv1_weight = model.features[0].weight# Method 2 # 这种方式还适合你想自己参考一个预训练模型写一个网络,各层的参数不变,但网络结构上表述有所不同# 这样你就可以把param迭代出来,赋给你的网络对应层,避免直接load不能匹配的问题!for layer,param in model.state_dict().items(): # param is weight or bias(Tensor) print layer,paramfeature map
由于pytorch是动态网络,不存储计算数据,查看各层输出的特征图并不是很方便!分下面两种情况讨论:
1、你想查看的层是独立的,那么你在forward时用变量接收并返回即可!!
class Net(nn.Module): def __init__(self): self.conv1 = nn.Conv2d(1, 1, 3) self.conv2 = nn.Conv2d(1, 1, 3) self.conv3 = nn.Conv2d(1, 1, 3) def forward(self, x): out1 = F.relu(self.conv1(x)) out2 = F.relu(self.conv2(out1)) out3 = F.relu(self.conv3(out2)) return out1, out2, out32、你的想看的层在nn.Sequential()顺序容器中,这个麻烦些,主要有以下几种思路:
# Method 1 巧用nn.Module.children()# 在模型实例化之后,利用nn.Module.children()删除你查看的那层的后面层import torchimport torch.nn as nnfrom torchvision import modelsmodel = models.alexnet(pretrained=True)# remove last fully-connected layernew_classifier = nn.Sequential(*list(model.classifier.children())[:-1])model.classifier = new_classifier# Third convolutional layernew_features = nn.Sequential(*list(model.features.children())[:5])model.features = new_features# Method 2 巧用hook,推荐使用这种方式,不用改变原有模型# torch.nn.Module.register_forward_hook(hook)# hook(module, input, output) -> Nonemodel = models.alexnet(pretrained=True)# 定义def hook (module,input,output): print output.size()# 注册handle = model.features[0].register_forward_hook(hook)# 删除句柄handle.remove()# torch.nn.Module.register_backward_hook(hook)# hook(module, grad_input, grad_output) -> Tensor or Nonemodel = alexnet(pretrained=True).to(device)outputs = []def hook (module,input,output): outputs.append(output) print len(outputs)handle = model.features[0].register_backward_hook(hook)注:还可以通过定义一个提取特征的类,甚至是重构成各层独立相同模型将问题转化成第一种
计算模型参数数量
def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)
以上这篇pytorch查看模型weight与grad方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
废话不多说,直接上代码吧~model.zero_grad()optimizer.zero_grad()首先,这两种方式都是把模型中参数的梯度设为0当optimi
有两种方式直接把模型的参数梯度设成0:model.zero_grad()optimizer.zero_grad()#当optimizer=optim.Optim
1Pytorch以ONNX方式保存模型defsaveONNX(model,filepath):'''保存ONNX模型:parammodel:神经网络模型:par
目标是想把在服务器上用pytorch训练好的模型转换为可以在移动端运行的tflite模型。最直接的思路是想把pytorch模型转换为tensorflow的模型,
深度学习中,模型训练完后,查看模型的参数量和浮点计算量,在此记录下:1THOP在pytorch中有现成的包thop用于计算参数数量和FLOP,首先安装thop: