一些前置知识(有关分类问题)
- 在搭建好网络后,传入图片,网络会返回一个结果,结果的形式为 [0.3,0.5,0.1,…………]。
- 数据集有多少类,结果就有多长即(len(结果)==数据集类别数)
- 结果里面的值代表该图片是对应类别的概率,如上面0.3代表图片是第一类的概率为0.3。
- 再说说目标值target即理想结果,如target=[5],代表图片是第六类的概率为1,是其他类的概率为0。
损失函数
作用:
- 获得数据的训练结果与对应的理想结果的误差
损失函数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)
#打印实际结果与预期结果的误差
反向传播
作用:
- 反向传播(后向传播)为我们更新输出提供一定的依据(为后面的优化器做准备)通过结果反向计算出神经网络中各个节点的梯度,并将其依次写入神经网络中(后面优化器需要用到梯度)。
函数例程:
res3.backward()
#一定要是经过损失函数处理后的结果来调用backward
优化器
作用:
- 通过梯度对神经网络中的各个参数进行调整,对模型进行优化,减小每张图片实际结果与理想结果之间的误差。
函数调用例程:
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)
#打印出训练的误差