一、损失函数
例子:
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], <strong>dtype=torch.float32</strong>)
- targets = torch.tensor([1, 2, 5], <strong>dtype=torch.float32</strong>)
- # 将输入input转化为,<strong>形状为1 batch_size,1 chanel,1 行 3列</strong>
- inputs = torch.reshape(input, (<strong>1, 1, 1, 3</strong>))
- targets = torch.reshape(targets, (1, 1, 1, 3))
- # 损失函数是L1Loss
- # <strong>默认是做平均为0.667,也可以设置参数做和为2.0</strong>
- loss = L1Loss(reduction="sum")
- result = loss(inputs, targets)
- print(result)
- # <strong>损失函数是MSELoss,平方差</strong>
- loss_MSE = nn.MSELoss()
- result_mse = loss_MSE(<strong>inputs, targets</strong>)
- print(result_mse)
- #<strong> 交叉熵 batch_size等于1,class等于3,表示3个类</strong>
- x = torch.tensor([<strong>0.1, 0.2, 0.3])</strong>
- <strong>y </strong>= torch.tensor([1])
- # 将x变成满足条件的(N, C)结构,输入为x
- x = torch.reshape<strong>(x, [1, 3]</strong>)
- # 交叉熵
- loss_cross = nn.CrossEntropyLoss()
- result = loss_cross(<strong>x, y</strong>)
- 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,
- <strong> transform=torchvision.transforms.ToTensor()</strong>)
- dataloader = DataLoader(<strong>dataset, batch_size=1</strong>)
- 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):
- <strong> x =self.model1(x)</strong>
- return x
- <strong>sun = SUN()</strong>
- for data in dataloader:
- imgs, targets = data
- <strong>outputs = sun(imgs)</strong>
- 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的参数值。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |