优化器,反向传播,损失函数(第七期)

一些前置知识(有关分类问题)

  1. 在搭建好网络后,传入图片,网络会返回一个结果,结果的形式为 [0.3,0.5,0.1,…………]
  2. 数据集有多少类,结果就有多长即(len(结果)==数据集类别数)
  3. 结果里面的值代表该图片是对应类别的概率,如上面0.3代表图片是第一类的概率为0.3。
  4. 再说说目标值target即理想结果,如target=[5],代表图片是第六类的概率为1,是其他类的概率为0。

损失函数

作用:

  1. 获得数据的训练结果与对应的理想结果的误差

损失函数1

loss=L1Loss() #均值误差

(默认误差求法:对应位置的像素相减所得的差的绝对值相加后的均值,即求差的绝对值的均值)

函数调用例程:


loss=L1Loss()  #创建损失函数

res=loss(input_, target)
#参数
#input:输入数据(实际结果)(类型为tensor)
#target: 目标数据(理想结果)(类型为tensor)

损失函数2

loss_mse=MSELoss() #均方差求误差

函数调用例程:

loss_mse=MSELoss()   #均方差

res2=loss_mse(input_, target)

#参数
#input:输入数据(实际结果)(类型为tensor)
#target: 目标数据(理想结果)(类型为tensor)

损失函数3

(该损失函数一般用于分类问题之中)

loss_cross=nn.CrossEntropyLoss()

loss_cross=nn.CrossEntropyLoss()

res3=loss_cross(imput, output)
#参数
#input:输入数据(实际结果)(类型为tensor)
#target: 目标数据(理想结果)(类型为tensor)

#input(tensor类型),要求输入图片shape必须是[N, C]
# (C表示神经网络中的类别数)(N代表图片张数batchsize)
#output(tensor类型),要求目标图片shape为[n]
# (n表示图片类型在数据集类别中的下标值)

函数调用例程:

x=torch.tensor([0.1, 0.2, 0.3])
# [0.1, 0.2, 0.3]  共有3种分类,
# 该图片是第一种类别,第二种类别,第三种类别概率


y=torch.tensor([1])
# [1] 目标数据的类别下标

x=torch.reshape(x, (1, 3))
#参数
#(1,3)表示这是1张图,神经网络中有3种分类

res3=loss_cross(x, y)
print(res3)
#打印实际结果与预期结果的误差

反向传播

作用:

  1. 反向传播(后向传播)为我们更新输出提供一定的依据(为后面的优化器做准备)通过结果反向计算出神经网络中各个节点的梯度,并将其依次写入神经网络中(后面优化器需要用到梯度)。

函数例程:

res3.backward()    
#一定要是经过损失函数处理后的结果来调用backward

优化器

作用:

  1. 通过梯度对神经网络中的各个参数进行调整,对模型进行优化,减小每张图片实际结果与理想结果之间的误差。

函数调用例程:

optim=torch.optim.SGD(
params=net.parameters(), lr=0.01
)  
#优化器
#参数
#params : 神经网络中所有参数
#(神经网络对象名.parameters())
#lr : 学习率

三者在训练集上的使用

res_loss=loss(output, targets) 

optim.zero_grad()   #将神经网络中的梯度清0,
#防止上一个循环中的梯度干扰本次循环新的梯度

res_loss.backward()  #产生各个参数的梯度值

optim.step()  
#将神经网络中的参数利用各参数的梯度值,进行优化

训练数据的源码

for empol in range(20):    
#将数据集中的所有数据遍历20次(模型训练20次)

    run_loss=0.0

    for data in test_dataloader:
        imgs, targets = data

        output=net(imgs)


        res_loss=loss(output, targets)

        optim.zero_grad()   
        
        res_loss.backward()  
        optim.step()      

        run_loss=run_loss+res_loss
    print(run_loss)
    #打印出训练的误差
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freejackman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值