pytorch自定义二值化网络层方式
时间:2022-02-02 09:35:04|栏目:Python代码|点击: 次
任务要求:
自定义一个层主要是定义该层的实现函数,只需要重载Function的forward和backward函数即可,如下:
import torch from torch.autograd import Function from torch.autograd import Variable
定义二值化函数
class BinarizedF(Function):
def forward(self, input):
self.save_for_backward(input)
a = torch.ones_like(input)
b = -torch.ones_like(input)
output = torch.where(input>=0,a,b)
return output
def backward(self, output_grad):
input, = self.saved_tensors
input_abs = torch.abs(input)
ones = torch.ones_like(input)
zeros = torch.zeros_like(input)
input_grad = torch.where(input_abs<=1,ones, zeros)
return input_grad
定义一个module
class BinarizedModule(nn.Module):
def __init__(self):
super(BinarizedModule, self).__init__()
self.BF = BinarizedF()
def forward(self,input):
print(input.shape)
output =self.BF(input)
return output
进行测试
a = Variable(torch.randn(4,480,640), requires_grad=True) output = BinarizedModule()(a) output.backward(torch.ones(a.size())) print(a) print(a.grad)
其中, 二值化函数部分也可以按照方式写,但是速度慢了0.05s
class BinarizedF(Function):
def forward(self, input):
self.save_for_backward(input)
output = torch.ones_like(input)
output[input<0] = -1
return output
def backward(self, output_grad):
input, = self.saved_tensors
input_grad = output_grad.clone()
input_abs = torch.abs(input)
input_grad[input_abs>1] = 0
return input_grad
上一篇:浅谈Selenium+Webdriver 常用的元素定位方式
栏 目:Python代码
本文标题:pytorch自定义二值化网络层方式
本文地址:http://www.codeinn.net/misctech/192157.html






