pytorch 權(quán)重weight 與 梯度grad 可視化操作
pytorch 權(quán)重weight 與 梯度grad 可視化
查看特定layer的權(quán)重以及相應(yīng)的梯度信息
打印模型
觀察到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 就可以查看梯度信息。
中間變量的梯度 : .register_hook
pytorch 為了節(jié)省顯存,在反向傳播的過(guò)程中只針對(duì)計(jì)算圖中的葉子結(jié)點(diǎn)(leaf variable)保留了梯度值(gradient)。但對(duì)于開發(fā)者來(lái)說(shuō),有時(shí)我們希望探測(cè)某些中間變量(intermediate variable) 的梯度來(lái)驗(yàn)證我們的實(shí)現(xiàn)是否有誤,這個(gè)過(guò)程就需要用到 tensor的register_hook接口
grads = {} def save_grad(name): def hook(grad): grads[name] = grad return hook x = torch.randn(1, requires_grad=True) y = 3*x z = y * y # 為中間變量注冊(cè)梯度保存接口,存儲(chǔ)梯度時(shí)名字為 y。 y.register_hook(save_grad('y')) # 反向傳播 z.backward() # 查看 y 的梯度值 print(grads['y'])
打印網(wǎng)絡(luò)回傳梯度
net.named_parameters()
parms.requires_grad 表示該參數(shù)是否可學(xué)習(xí),是不是frozen的;
parm.grad 打印該參數(shù)的梯度值。
net = your_network().cuda() def train(): ... outputs = net(inputs) loss = criterion(outputs, targets) loss.backward() for name, parms in net.named_parameters(): print('-->name:', name, '-->grad_requirs:',parms.requires_grad, \ ' -->grad_value:',parms.grad)
查看pytorch產(chǎn)生的梯度
[x.grad for x in self.optimizer.param_groups[0]['params']]
pytorch模型可視化及參數(shù)計(jì)算
我們?cè)谠O(shè)計(jì)完程序以后希望能對(duì)我們的模型進(jìn)行可視化,pytorch這里似乎沒有提供相應(yīng)的包直接進(jìn)行調(diào)用,下面把代碼貼出來(lái):
import torch from torch.autograd import Variable import torch.nn as nn from graphviz import Digraph def make_dot(var, params=None): if params is not None: assert isinstance(params.values()[0], Variable) param_map = {id(v): k for k, v in params.items()} node_attr = dict(style='filled', shape='box', align='left', fontsize='12', ranksep='0.1', height='0.2') dot = Digraph(node_attr=node_attr, graph_attr=dict(size="12,12")) seen = set() def size_to_str(size): return '('+(', ').join(['%d' % v for v in size])+')' def add_nodes(var): if var not in seen: if torch.is_tensor(var): dot.node(str(id(var)), size_to_str(var.size()), fillcolor='orange') elif hasattr(var, 'variable'): u = var.variable name = param_map[id(u)] if params is not None else '' node_name = '%s\n %s' % (name, size_to_str(u.size())) dot.node(str(id(var)), node_name, fillcolor='lightblue') else: dot.node(str(id(var)), str(type(var).__name__)) seen.add(var) if hasattr(var, 'next_functions'): for u in var.next_functions: if u[0] is not None:dot.edge(str(id(u[0])), str(id(var)))add_nodes(u[0]) if hasattr(var, 'saved_tensors'): for t in var.saved_tensors: dot.edge(str(id(t)), str(id(var))) add_nodes(t) add_nodes(var.grad_fn) return dot
我們?cè)谖覀兊哪P拖旅嬷苯舆M(jìn)行調(diào)用就可以了,例如:
if __name__ == "__main__": model = DeepLab(backbone='resnet', output_stride=16) input = torch.rand(1, 3, 53, 53) output = model(input) g = make_dot(output) g.view() params = list(net.parameters()) k = 0 for i in params: l = 1 print("該層的結(jié)構(gòu):" + str(list(i.size()))) for j in i.size(): l *= j print("該層參數(shù)和:" + str(l)) k = k + l print("總參數(shù)數(shù)量和:" + str(k))
模型部分可視化結(jié)果:
參數(shù)計(jì)算:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。