CNN_优化器_loss()_代价函数

optimizer.zero_grad()

设置梯度为None, 而不是设置为零,很多人觉得这里是将梯度设置为0,这样会占用更少的内存,并可以适当地提高性能。

然而,这种重载改变了某些行为。例如:1、当用户试图访问一个渐变并对其执行手动操作时,一个None属性或一个满是0的张量将会有不同的行为。2. 如果用户请求' ' zero_grad(set_to_none=True) ' '后跟一个向后传递,' '。对于没有接收到梯度的参数,grad ' ' s保证为None。3.“火炬。optim ' '优化器有一个不同的行为,如果梯度是0或None

torch.optim.adam.Adam def __init__(self,
             params: Iterable[Tensor] | Iterable[dict],
             lr: float = ...,
             betas: Tuple[float, float] = ...,
             eps: float = ...,
             weight_decay: float = ...,
             amsgrad: bool = ...)

pytorch自带的模块中有着很多优化器算法,比较常用的类似SGD、Adam、RMSprop等等,又能自动调整学习率(好像就SGD和ASGD不可以自动调整学习率,其他都行,哈哈哈)

loss = torch.nn.CrossEntropyLoss() 
...
train_loss = loss(y_pred, y_train)
...
train_loss.backward()

optimizer.step()  #更新优化器,重新评估模型并再次返回损失

torch.nn.CrossEntropyLoss()设置代价(损失)函数的计算方法,我这里因为所要求的模型是属于分类模型(Regression),所以我用的是交叉熵求损失值;

y_pred为模型预测输出值,y_train就是我的真实值,从而代入交叉熵求值,就可以得到train_loss值;

最后将模型的计算的损失值train_loss通过backward()反向传播回去,通过optimizer.step()

会使优化器在得到我们的反向传播的损失值就可以通过在动态的学习率下,进行调整我们的模型,最后就会使得我们的loss值趋近最小,也就是梯度下降最终的目的。


版权声明:本文为weixin_43984636原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。