损失函数与反向传播

一、损失函数

例子:

outputtarget
选择(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)

输出的结果是:

0d9a704e599a436a9af1e2af686162a9.png

第一个tensor数据是图片的概率,其中概率最大的是第四张图像。预测出图像是第四张图片的类别。

四、与损失函数的误差

使用损失函数在最后一部分:

loss = nn.CrossEntropyLoss()

sun = SUN()
for data in dataloader:
    imgs, targets = data
    outputs = sun(imgs)
    result = loss(outputs, targets)
    print(result)

输出结果,表示神经网络的输出与真实网络的输出误差:

789fda7511ec491c86a60071cc36bc18.png

五、反向传播

对于神经网络来说,每一个卷积和中的每一个参数就是我们送需要调节的,给每一个卷积核的参数都设置了一个grad。每一个节点,每一个参数都会提供一个grad。在优化过程中,就会根据grad来进行优化。实现对整个loss降低的目的。

将上述的代码进行debug查看grad:

d254b47c6d1a4724a27f8719ee5b3f8c.png

将断点打在backward处。

如何使用debug:

点击小虫子,运行结束后,出现各个变量;

选择自己搭建的神经网络;

选择Module;

选择私密属性;

选择modules;

点进变量去;

可以查看到grad=None

3101c664f7714534991f2c4c7d42eebb.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值