一、损失函数
# L1Loss
(1)解读官方文档
(2)代码示例
#MSELoss(平方差)
(1)解读官方文档
(2)代码示例
# CrossEntropyloss(交叉熵)
(1)解读官方文档
( 原官方文档中公式解读在本子上)
(2)代码示例
exp表示已e为底的指数函数计算,而log默认以10为底,因此改成ln进行计算,结果与代码中相同:
二、在之前写的神经网络中应用损失函数
添加代码:
作用:①计算实际输出和目标之间的差距;②为我们更新输出提供一定的依据(反向传播)
:对于神经网络来说/对于卷积层来说,其中的每一个卷积核当中的参数就是需要调的。给每一个卷积核的参数设置了一个grad(梯度),当采用反向传播的时候,每一个节点/每一个要更新的参数,他都会求出一个对应的梯度,在优化的过程中根据这个梯度对当中的参数进行一个优化,最终达到一个loss降低的目的。
三、反向传播
#梯度下降
不进行反向传播,打一个断点查看梯度情况:
打开一个卷积层,查看梯度为None:
让代码运行到41行去进行反向传播,再查看梯度信息已经出现,如果没有反向传播这一步就一直没有梯度信息:
反向传播之后,就可以计算出每个节点的参数。有了各个节点的参数的梯度,接下来就可以选用合适的优化器来对这些参数进行一个优化,以对整个loss达到一个降低的目的。
四、优化器
(1)解读官方文档
不同的优化器所需要的参数有所差距,一般相似处是params(要传入的模型参数,让优化器知道模型长什么样、需要调节的参数有哪些)、lr(学习速率)
(2)代码示例
# 随机梯度下降优化器(SGD)
打断点,debugger第一个断点查看变化:
点击左边绿色箭头,debugger第二个断点,即运行完44行,梯度有了变化,但是数据还没变化:
debugger第三个断点,即运行完46行,优化器对数据已经进行了优化:
数据还没有去完,循环运行42行,梯度进行了清0,开始新一轮的优化:
输出结果:
但是loss并没有明显的减小,原因:dataloader只对这个网络上的数据模型都只是看了一遍,这只是进行了一轮的学习,因此需要对循环外再加多轮次学习:
按理说,应该越训练误差越小,为什么会变大估计是模型或者什么参数的问题(学习率太大,批量数值不对,需要调参)。
把学习率降低,好像真的有好转!yep!!!
可能的原因:神经网络训练时损失(loss)不下降常见解决办法以及训练时损失出现nan可能原因以及解决_训练损失不下降_童话ing的博客-CSDN博客