IT评测·应用市场-qidao123.com

标题: 损失函数与反向传播 [打印本页]

作者: 耶耶耶耶耶    时间: 2024-9-3 08:03
标题: 损失函数与反向传播
一、损失函数

例子:
outputtarget
选择(10)选择(30)
填空(10)

填空(20)
解答(10)解答(50)
loss = (30-10)+(20-10)+(50-10)
loss的值越小越好,根据loss进步输出,神经网络根据loss的值不断的练习。计算实际输出与目标之间的差距,2、为更新输出提供一定的依据(反向传播)
二、损失函数代码

在代码运行中,出现如下问题got long:
  1. RuntimeError: mean(): could not infer output dtype. Input dtype must be either a floating point or complex dtype. Got: Long
复制代码
必要到场的语句是到场dtype = torch.float32语句
  1. input = torch.tensor([1, 2, 3], dtype=torch.float32)
  2. targets = torch.tensor([1, 2, 5], dtype=torch.float32)
复制代码
 完整代码如下:
  1. import torch
  2. from torch.nn import L1Loss, MSELoss
  3. # 防止自己写错的办法
  4. from torch import nn
  5. input = torch.tensor([1, 2, 3], <strong>dtype=torch.float32</strong>)
  6. targets = torch.tensor([1, 2, 5], <strong>dtype=torch.float32</strong>)
  7. # 将输入input转化为,<strong>形状为1 batch_size,1 chanel,1 行 3列</strong>
  8. inputs = torch.reshape(input, (<strong>1, 1, 1, 3</strong>))
  9. targets = torch.reshape(targets, (1, 1, 1, 3))
  10. # 损失函数是L1Loss
  11. # <strong>默认是做平均为0.667,也可以设置参数做和为2.0</strong>
  12. loss = L1Loss(reduction="sum")
  13. result = loss(inputs, targets)
  14. print(result)
  15. # <strong>损失函数是MSELoss,平方差</strong>
  16. loss_MSE = nn.MSELoss()
  17. result_mse = loss_MSE(<strong>inputs, targets</strong>)
  18. print(result_mse)
  19. #<strong> 交叉熵 batch_size等于1,class等于3,表示3个类</strong>
  20. x = torch.tensor([<strong>0.1, 0.2, 0.3])</strong>
  21. <strong>y </strong>= torch.tensor([1])
  22. # 将x变成满足条件的(N, C)结构,输入为x
  23. x = torch.reshape<strong>(x, [1, 3]</strong>)
  24. # 交叉熵
  25. loss_cross = nn.CrossEntropyLoss()
  26. result = loss_cross(<strong>x, y</strong>)
  27. print(result)
复制代码
三、神经网络猜测

再例如,放入到之前的神经网络中处理,对图片举行猜测:
  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
  5. from torch.utils.data import DataLoader
  6. from torch.utils.tensorboard import SummaryWriter
  7. dataset = torchvision.datasets.CIFAR10('../datas', train=False, download=True,
  8.                                       <strong> transform=torchvision.transforms.ToTensor()</strong>)
  9. dataloader = DataLoader(<strong>dataset, batch_size=1</strong>)
  10. class SUN(nn.Module):
  11.     def __init__(self):
  12.         super(SUN, self).__init__()
  13.         self.model1 = Sequential(
  14.             Conv2d(3, 32, 5, padding=2),
  15.             MaxPool2d(2),
  16.             Conv2d(32, 32, 2, padding=2),
  17.             MaxPool2d(2),
  18.             Conv2d(32, 64, 5, padding=2),
  19.             MaxPool2d(2),
  20.             Flatten(),
  21.             Linear(1024, 64),
  22.             Linear(64, 10)
  23.         )
  24.     def forward(self, x):
  25.        <strong> x =self.model1(x)</strong>
  26.         return x
  27. <strong>sun = SUN()</strong>
  28. for data in dataloader:
  29.     imgs, targets = data
  30.     <strong>outputs = sun(imgs)</strong>
  31.     print(outputs)
  32.     print(targets)
复制代码
输出的结果是:

第一个tensor数据是图片的概率,其中概率最大的是第四张图像。猜测出图像是第四张图片的类别。
四、与损失函数的误差

使用损失函数在最后一部分:
  1. loss = nn.CrossEntropyLoss()
  2. sun = SUN()
  3. for data in dataloader:
  4.     imgs, targets = data
  5.     outputs = sun(imgs)
  6.     result = loss(outputs, targets)
  7.     print(result)
复制代码
输出结果,表示神经网络的输出与真实网络的输出误差:

五、反向传播

对于神经网络来说,每一个卷积和中的每一个参数就是我们送必要调治的,给每一个卷积核的参数都设置了一个grad。每一个节点,每一个参数都会提供一个grad。在优化过程中,就会根据grad来举行优化。实现对整个loss降低的目的。
将上述的代码举行debug查看grad:

将断点打在backward处。
如何使用debug:
点击小虫子,运行竣事后,出现各个变量;
选择自己搭建的神经网络;
选择Module;
选择私密属性;
选择modules;
点进变量去;
可以查看到grad=None

运行下一句,按上述按钮,出现,grad的参数值。
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4