之前说过Loss Functions有两个作用:1.可以计算我们实际输出和目标之间的差距;2.为我们更新输出提供一定的依据(反向传播),这篇文章我们就通过搭建一个神经网络,使用nn.CrossEntropyLoss来学习一下这两个作用。
文章目录
一、搭建神经网络
二、使用nn.CrossEntropyLoss
代码如下:
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader#调用CIFAR10数据集
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
#使用dataloader数据迭代器
dataloader = DataLoader(dataset, batch_size=1)#搭建神经网络,这个Test网络就是CIFAR10数据集的网络
class Test(nn.Module):
def __init__(self): #初始化
super(Test, self).__init__()
self.seq = Sequential(
Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, 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.seq(x)
return x#创建网络
test = Test()#测试一下网络
for data in dataloader:
imgs, targets = data
output = test(imgs)
print(output)
print(targets)
输出结果(取其中一个):
tensor([[-0.0292, 0.0408, -0.0051, 0.0530, -0.0490, -0.0823, -0.0166, -0.0705,
0.0269, 0.0261]], grad_fn=)
tensor([3])
结果说明,这个的图片结果神经网络后有10个输出,这些输出数字代表这个图片为这个类别的概率,这个图片的target是3。
像这样的分类问题,我们就可以使用交叉熵,nn.CrossEntropyLoss
代码如下:
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
#调用CIFAR10数据集
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
#使用dataloader数据迭代器
dataloader = DataLoader(dataset, batch_size=1)
#搭建神经网络,这个Test网络就是CIFAR10数据集的网络
class Test(nn.Module):
def __init__(self): #初始化
super(Test, self).__init__()
self.seq = Sequential(
Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, 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.seq(x)
return x
#创建网络
test = Test()
loss_cross = nn.CrossEntropyLoss()
for data in dataloader:
imgs, targets = data
output = test(imgs)
result_loss = loss_cross(output, targets)
print(result_loss)
输出结果(第一个):
第一个tensor(2.2859, grad_fn=)
这个输出代表实际输出与目标自己的误差
至此,可以了解到Loss Functions的第一个作用:可以计算我们实际输出和目标之间的差距。
Loss Functions的第二个作用:.为我们更新输出提供一定的依据(反向传播)
接下来看看第二个作用,怎么为我们更新输出提供一定的依据(反向传播)
再看一下输出结果:tensor(2.2859, grad_fn=
可以这样理解:它给我们每一个卷积核的参数都设置了一个叫grad的一个梯度。
当我们采用反向传播的时候,每一个需要更新的参数,它都会求出来一个对应的梯度。
然后我们在优化的过程中,它就可以根据这个梯度对数据进行优化,最终达到整个Loss下降的目的。
如图,我们没有进行反向传播时,grad梯度是None
输入result_loss.backwrd() ,进行反向传播后,再进行查看
grad梯度就已经自动计算出来。
后面还需要选择合适的优化器,优化器会利用这些梯度对我们提供的神经网络中的一些参数进行更新,对这些参数进行优化,对整个Loss达到一个降低的目的。