pytorch交叉熵损失函数计算,pytorch正则化损失函数
本文主要介绍PyTorch计算损失函数的Hessian矩阵对模型参数的详细说明。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010序模型定义求解Hessian矩阵
目录
在实现Per-FedAvg的代码时,会遇到以下问题:
可以发现,我们需要损失函数对模型参数的Hessian矩阵。
前言
我们定义一个相对简单的模型:
类ANN(nn。模块):
def __init__(self):
超级(安,自我)。__init__()
self.sigmoid=nn。乙状结肠()
self.fc1=nn。线性(3,4)
self.fc2=nn。线性(4,5)
定义转发(自身,数据):
x=self.fc1(数据)
x=self.fc2(x)
返回x
输出模型的参数:
模型=ANN()
对于model.parameters()中的参数:
print(param.size())
输出如下所示:
火炬。大小([4,3])
火炬。大小([4])
火炬。大小([5,4])
火炬。大小([5])
模型定义
我们首先定义数据:
data=torch.tensor([1,2,3],dtype=torch.float)
label=torch.tensor([1,1,5,7,8],dtype=torch.float)
pred=模型(数据)
loss_fn=nn。MSELoss()
loss=loss_fn(pred,label)
然后解决第一步:
grads=torch . autograded . grad(loss,model.parameters(),retain_graph=True,create_graph=True)
输出梯度:
(张量([[-1.0530,-2.1059,-3.1589),
[ 2.3615, 4.7229, 7.0844],
[-1.5046, -3.0093, -4.5139],
[-2.0272,-4.0543,-6.0815]],grad_fn=TBackward0),张量([-1.0530,2.3615,-1.5046,-2.0272),grad_fn=SqueezeBackward1),张量([[ 0.2945,-0.2725,-0.8159,-0.6720),
[ 0.1936, -0.1791, -0.5362, -0.4416],
[ 1.0800, -0.9993, -2.9918, -2.4641],
[ 1.3448, -1.2444, -3.7255, -3.0683],
[ 1.2436,-1.1507,-3.4450,-2.8373]],grad_fn=TBackward0),张量([-0.6045,-0.3972,-2.2165,-2.7600,-2.5522),
grad _ fn=mselossbackward backward 0))
总共可以找到四个张量,分别是损失函数对四个参数张量的梯度(两层,各有权重和偏差)。
然后,对于每个张量,求解第二步:
hessian_params=[]
对于范围内的k(长度(梯度)):
Hess _ params=torch . zeros _ like(grads[k])
对于范围内的I(grads[k])。大小(0)):
#判断是W还是B
if len(grads[k]。size())==2:
# w
对于范围内的j(grads[k])。尺寸(1)):
hess_params[i,j]=torch . autograded . grad(grads[k][I][j],model.parameters(),retain_graph=True)[k][i,j]
else:
# b
Hess _ params[I]=torch . autograded . grad(grads[k][I],model.parameters(),retain_graph=True)[k][i]
hessian_params.append
这里需要注意的是,模型由两层组成,每层都有一个权值和一个偏移量,其中权值参数是二维的,偏移量参数是一维的。所以在进行具体的二阶导数时,需要做出判断。
最后的hessian_params是一个列表,它包含四个张量,对应于损失函数对两层网络的权重和偏差的二阶。
以上是PyTorch计算损失函数对模型参数的Hessian矩阵示例的细节。关于PyTorch计算损失函数的Hessian矩阵的更多信息,请关注盛行IT软件开发工作室的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。