获取Pytorch的反向梯度--以Depthwise为例

获取Pytorch的反向梯度–以Depthwise为例

前言

在开发自己的训练框架或者手写算子的时候,经常要确认的一件事情是,怎么确定自己的手写的算子是正确的,那么baseline就是开源框架(pytorch,caffe,tensorflow等),对于这种框架而言,如何获取求导的梯度+正向的结果。本文以Depthwise_backward为例。

Depthwise_backward

初始化一个算子,特别注意的地方在于,所有的反向求导的输入out.backward(gradient=outgrad)这里都是要初始化全一的向量的,这样才能保证所有的结果是正确的。

总体代码

import numpy as np 
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

def tensor_hook(grad):
	print('tensor hook')
	print('grad:', grad)
	return grad
class MyNet(nn.Module):
	def __init__(self):
		super(MyNet, self).__init__()
		self.f1 = nn.Conv2d(3,3,4,1,0,groups = 3,bias = False)
	def forward(self, input):
		self.input = input
		output = self.f1(input)
		return output
	def my_hook(self, module, grad_input, grad_output):
		print('original grad:', grad_input)
		print('original outgrad:', grad_output)

if __name__ == '__main__':

	net = MyNet()
	p = net.state_dict()
	params = {}
	for k,v in p.items():
		params["weight"] = v.detach().numpy()
	x = torch.randn((1,3,322,322))
	params["data"] = x.numpy()
	x.requires_grad = True
	x.register_hook(tensor_hook)
	out = net(x)
	out.retain_grad()
	outgrad = torch.from_numpy(np.ones(out.shape,dtype = "float32"))
	out.backward(gradient=outgrad)
	for name, param in net.named_parameters():
		params["dw"] = param.grad.numpy()
	params["dx"] = x.grad.numpy()
	params["dout"] = outgrad.numpy()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值