一、损失函数
例子:
output | target |
选择(10) | 选择(30) |
填空(10) | 填空(20) |
解答(10) | 解答(50) |
loss = (30-10)+(20-10)+(50-10) |
loss的值越小越好,根据loss提高输出,神经网络根据loss的值不断的训练。计算实际输出与目标之间的差距,2、为更新输出提供一定的依据(反向传播)
二、损失函数代码
在代码运行中,出现如下问题got long:
RuntimeError: mean(): could not infer output dtype. Input dtype must be either a floating point or complex dtype. Got: Long
需要加入的语句是加入dtype = torch.float32语句:
input = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)
完整代码如下:
import torch from torch.nn import L1Loss, MSELoss # 防止自己写错的办法 from torch import nn input = torch.tensor([1, 2, 3], dtype=torch.float32) targets = torch.tensor([1, 2, 5], dtype=torch.float32) # 将输入input转化为,形状为1 batch_size,1 chanel,1 行 3列 inputs = torch.reshape(input, (1, 1, 1, 3)) targets = torch.reshape(targets, (1, 1, 1, 3)) # 损失函数是L1Loss # 默认是做平均为0.667,也可以设置参数做和为2.0 loss = L1Loss(reduction="sum") result = loss(inputs, targets) print(result) # 损失函数是MSELoss,平方差 loss_MSE = nn.MSELoss() result_mse = loss_MSE(inputs, targets) print(result_mse) # 交叉熵 batch_size等于1,class等于3,表示3个类 x = torch.tensor([0.1, 0.2, 0.3]) y = torch.tensor([1]) # 将x变成满足条件的(N, C)结构,输入为x x = torch.reshape(x, [1, 3]) # 交叉熵 loss_cross = nn.CrossEntropyLoss() result = loss_cross(x, y) print(result)
三、神经网络预测
再例如,放入到之前的神经网络中处理,对图片进行预测:
import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter dataset = torchvision.datasets.CIFAR10('../datas', train=False, download=True, transform=torchvision.transforms.ToTensor()) dataloader = DataLoader(dataset, batch_size=1) class SUN(nn.Module): def __init__(self): super(SUN, self).__init__() self.model1 = Sequential( Conv2d(3, 32, 5, padding=2), MaxPool2d(2), Conv2d(32, 32, 2, padding=2), MaxPool2d(2), Conv2d(32, 64, 5, padding=2), MaxPool2d(2), Flatten(), Linear(1024, 64), Linear(64, 10) ) def forward(self, x): x =self.model1(x) return x sun = SUN() for data in dataloader: imgs, targets = data outputs = sun(imgs) print(outputs) print(targets)
输出的结果是:
第一个tensor数据是图片的概率,其中概率最大的是第四张图像。预测出图像是第四张图片的类别。
四、与损失函数的误差
使用损失函数在最后一部分:
loss = nn.CrossEntropyLoss() sun = SUN() for data in dataloader: imgs, targets = data outputs = sun(imgs) result = loss(outputs, targets) print(result)
输出结果,表示神经网络的输出与真实网络的输出误差:
五、反向传播
对于神经网络来说,每一个卷积和中的每一个参数就是我们送需要调节的,给每一个卷积核的参数都设置了一个grad。每一个节点,每一个参数都会提供一个grad。在优化过程中,就会根据grad来进行优化。实现对整个loss降低的目的。
将上述的代码进行debug查看grad:
将断点打在backward处。
如何使用debug:
点击小虫子,运行结束后,出现各个变量;
选择自己搭建的神经网络;
选择Module;
选择私密属性;
选择modules;
点进变量去;
可以查看到grad=None
运行下一句,按上述按钮,出现,grad的参数值。