IT评测·应用市场-qidao123.com
标题:
损失函数与反向传播
[打印本页]
作者:
耶耶耶耶耶
时间:
2024-9-3 08:03
标题:
损失函数与反向传播
一、损失函数
例子:
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4