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é)省顯存,在反向傳播的過程中只針對計算圖中的葉子結(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)絡(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ù)計算
我們在設(shè)計完程序以后希望能對我們的模型進行可視化,pytorch這里似乎沒有提供相應(yīng)的包直接進行調(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Django項目配置連接多個數(shù)據(jù)庫的方法記錄
最近在進行django項目開發(fā)的時候,遇到了需要連接兩個MySQL數(shù)據(jù)庫的問題,下面這篇文章主要給大家介紹了關(guān)于Django項目配置連接多個數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2022-05-05
十個Python練手的實戰(zhàn)項目,學(xué)會這些Python就基本沒問題了(推薦)
這篇文章主要介紹了Python實戰(zhàn)項目,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
django虛擬環(huán)境(virtualenv)的創(chuàng)建
在使用django開發(fā)項目的時候,一個環(huán)境只能對應(yīng)一個項目,若不安裝虛擬環(huán)境、都裝在系統(tǒng)里面,每次項目加載都需要加載所有的安裝包,本文就介紹django虛擬環(huán)境的安裝,感興趣的可以了解一下2021-08-08
Python密碼學(xué)XOR算法編碼流程及乘法密碼教程
這篇文章主要為大家介紹了Python密碼學(xué)XOR流程及乘法密碼教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
win系統(tǒng)下為Python3.5安裝flask-mongoengine 庫
MongoEngine 是一個用來操作 MongoDB 的 ORM 框架,如果你不知道什么是 ORM,可以參考 Flask-SQLAlchemy 一節(jié)。在 Flask 中,我們可以直接使用 MongoEngine,也可使用 Flask-MongoEngine ,它使得在 Flask 中使用 MongoEngine 變得更加簡單。2016-12-12

