之前遇到的问题
量化的模块替代原先模块,在def __init__()中创建scale参数并且赋初值为1,在首次前向传播中初始化scale,但是在随后的前向传播中,scale的值仍然是1
解决
能直接赋值的网络参数要求requires_grad=False,要先对scale初始化,再将requires_grad=True
scale原先的初始化为
Class AlsqQuan(Quantizier):
def __init__(self,...):
....
self.s=torch.nn.Parameter(torch.ones(1),requires_grad=True)
self.init_state=torch.nn.Parameter(torch.zeros(1),requires_grad=False)
def forward(self,x):
if self.init_state==0:
new_s=.....
self.s.data=new_s
self.init_state+=1
return x
else:
.....
修改以后是
Class AlsqQuan(Quantizier):
def __init__(self,...):
....
self.s=torch.nn.Parameter(torch.ones(1),requires_grad=False)
self.init_state=torch.nn.Parameter(torch.zeros(1),requires_grad=False)
def forward(self,x):
if self.init_state==0:
new_s=.....
self.s.data=new_s
self.s.requires_grad=True
self.init_state+=1
return x
else:
.....