Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中重写一小部分代码的最佳实践_Python_Inheritance_Coding Style - Fatal编程技术网

在Python中重写一小部分代码的最佳实践

在Python中重写一小部分代码的最佳实践,python,inheritance,coding-style,Python,Inheritance,Coding Style,我想重写给定类中的函数,我正在寻找最优雅的方法。假设我有一个类Foo,函数是bar()。我只想更改栏的最后一行。更具体地说,我想更改PyTorch中torch.optim的Adam类中的step()函数 通过创建子类并重写bar,是实现此目的的唯一方法。我将需要复制所有重复的代码,只需更改一行。有更好的办法吗 下面是实际的实现。上一个是原始函数,下一个(除最后一行之外的名称)是我的自定义函数: def步骤(self,closure=None): “”“执行单个优化步骤。 论据: 闭包(可调用,可

我想重写给定类中的函数,我正在寻找最优雅的方法。假设我有一个类
Foo
,函数是
bar()
。我只想更改
栏的最后一行
。更具体地说,我想更改PyTorch中
torch.optim
Adam
类中的
step()
函数

通过创建子类并重写
bar
,是实现此目的的唯一方法。我将需要复制所有重复的代码,只需更改一行。有更好的办法吗

下面是实际的实现。上一个是原始函数,下一个(除最后一行之外的名称)是我的自定义函数:

def步骤(self,closure=None):
“”“执行单个优化步骤。
论据:
闭包(可调用,可选):重新评估模型的闭包
并返回损失。
"""
损失=无
如果关闭不是无:
损失=关闭()
对于self.param_组中的组:
对于组['params']中的p:
如果p.grad为无:
持续
梯度=p.grad.data
如果梯度是稀疏的:
提高运行时错误(“ADAM不支持稀疏梯度,请考虑SabSEADAM”)
amsgrad=组['amsgrad']
状态=自身状态[p]
#状态初始化
如果len(状态)==0:
状态['step']=0
#梯度值的指数移动平均
状态['exp_avg']=torch.zero_like(p.data)
#平方梯度值的指数移动平均
状态['exp_avg_sq']=torch.zero_like(p.data)
如果是amsgrad:
#保持所有经验移动平均平方梯度的最大值。价值观
状态['max_exp_avg_sq']=火炬零点(p.data)
exp_avg,exp_avg_sq=州['exp_avg'],州['exp_avg_sq']
如果是amsgrad:
max_exp_avg_sq=状态['max_exp_avg_sq']
beta1,beta2=组['betas']
状态['step']+=1
如果组[“重量衰减”]!=0:
渐变添加(组['重量衰减],p.数据)
#衰减一、二阶矩运行平均系数
exp_平均多(beta1)。添加(1-beta1,梯度)
exp_avg_sq.mul(beta2)。addcmul_1(beta2,grad,grad)
如果是amsgrad:
#到目前为止,保持所有第二时刻运行平均值的最大值
torch.max(max_exp_avg_sq,exp_avg_sq,out=max_exp_avg_sq)
#使用最大值对坡度的运行平均值进行归一化
denom=max_exp_avg_sq.sqrt().add_(组['eps'))
其他:
denom=exp_avg_sq.sqrt().add_(组['eps'])
偏差校正1=1-β**状态['step']
偏差校正2=1-β2**状态[步骤]
步长=组['lr']*math.sqrt(偏差校正2)/偏差校正1
p、 data.addcdiv(步长大小,exp平均值,denom)
回波损耗
def步骤(self,closure=None):
“”“执行单个优化步骤。
论据:
闭包(可调用,可选):重新评估模型的闭包
并返回损失。
"""
损失=无
如果关闭不是无:
损失=关闭()
对于self.param_组中的组:
对于组['params']中的p:
如果p.grad为无:
持续
梯度=p.grad.data
如果梯度是稀疏的:
提高运行时错误(“ADAM不支持稀疏梯度,请考虑SabSEADAM”)
amsgrad=组['amsgrad']
状态=自身状态[p]
#状态初始化
如果len(状态)==0:
状态['step']=0
#梯度值的指数移动平均
状态['exp_avg']=torch.zero_like(p.data)
#平方梯度值的指数移动平均
状态['exp_avg_sq']=torch.zero_like(p.data)
如果是amsgrad:
#保持所有经验移动平均平方梯度的最大值。价值观
状态['max_exp_avg_sq']=火炬零点(p.data)
exp_avg,exp_avg_sq=州['exp_avg'],州['exp_avg_sq']
如果是amsgrad:
max_exp_avg_sq=状态['max_exp_avg_sq']
beta1,beta2=组['betas']
状态['step']+=1
如果组[“重量衰减”]!=0:
渐变添加(组['重量衰减],p.数据)
#衰减一、二阶矩运行平均系数
exp_平均多(beta1)。添加(1-beta1,梯度)
exp_avg_sq.mul(beta2)。addcmul_1(beta2,grad,grad)
如果是amsgrad:
#到目前为止,保持所有第二时刻运行平均值的最大值
torch.max(max_exp_avg_sq,exp_avg_sq,out=max_exp_avg_sq)
#使用最大值对坡度的运行平均值进行归一化
denom=max_exp_avg_sq.sqrt().add_(组['eps'))
其他:
denom=exp_avg_sq.sqrt().add_(组['eps'])
偏差校正1=1-β**状态['step']
偏差校正2=1-β2**状态[步骤]
步长=组['lr']*math.sqrt(偏差校正2)/偏差校正1
#更改了p.data。将CDIV(步长、平均值、分母)添加到
p、 数据。添加(步长大小*(exp\u平均值/denom))
回波损耗

如果您给出一个更现实的示例,既可以是返回语句,也可以是一些实际的代码,而不是说“一堆代码”的注释,这会有所帮助。方法的两部分之间肯定有某种逻辑关系?否则,为它们创建两个方法,如果需要,创建一个方便的方法来调用这两个方法