五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

pytorch 權(quán)重weight 與 梯度grad 可視化操作

發(fā)布日期:2022-03-18 16:52 | 文章來源:腳本之家

pytorch 權(quán)重weight 與 梯度grad 可視化

查看特定layer的權(quán)重以及相應的梯度信息

打印模型

觀察到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é)省顯存,在反向傳播的過程中只針對計算圖中的葉子結(jié)點(leaf variable)保留了梯度值(gradient)。但對于開發(fā)者來說,有時我們希望探測某些中間變量(intermediate variable) 的梯度來驗證我們的實現(xiàn)是否有誤,這個過程就需要用到 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
# 為中間變量注冊梯度保存接口,存儲梯度時名字為 y。
y.register_hook(save_grad('y'))
# 反向傳播 
z.backward()
# 查看 y 的梯度值
print(grads['y'])

打印網(wǎng)絡回傳梯度

net.named_parameters()

parms.requires_grad 表示該參數(shù)是否可學習,是不是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ù)計算

我們在設計完程序以后希望能對我們的模型進行可視化,pytorch這里似乎沒有提供相應的包直接進行調(diào)用,下面把代碼貼出來:

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

我們在我們的模型下面直接進行調(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īng)驗,希望能給大家一個參考,也希望大家多多支持本站。

香港服務器租用

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關(guān)注
微信

關(guān)注官方微信
頂部