欢迎关注 “小白玩转Python”,发现更多 “有趣”
引言
损失函数可以帮助我们量化我们现有模型在预测某个值时的好坏程度。本文旨在解释损失函数在神经网络中的作用。
我假设你对神经网络和 Pytorch 有基本的了解。在本篇文章中,我将使用 google colab 来编写和测试代码。我将使用来自 kaggle 的狗和猫的数据集。你可以从这里下载数据集:https://www.kaggle.com/c/dogs-vs-cats。
图片来自 kaggle 数据集
我下载的数据集看起来像这样,我将只使用猫的图像:
开始
我将从一个简单神经网络的例子开始解释,如图1所示,其中 x1 和 x2 是函数 f(x) 的输入。输出 y_hat 是通过激活函数的输入的加权和。为了简单起见,我略去了偏置项。
单层神经网络
什么是损失函数?
让我们准备一个猫的训练数据集以及每个输入图像的真实标签,并将其传递给我们的模型。
train_transforms =transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, .406],
[0.229, 0.224,.225])])
train_data = datasets.ImageFolder(data_dir + '/train', transform=train_transforms)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
我们将在本教程中使用的预先训练的模型:
model = models.densenet121(pretrained=True)
classifier = nn.Sequential(nn.Linear(2048, 512),
nn.ReLU(),
nn.Dropout(p=0.2),
nn.Linear(512,2),
nn.LogSoftmax(dim=1)
)
所有的训练图像将被分批传递给这个模型:
for epoch in range(epochs):
for inputs, labels in train_loader:
logps = model.forward(inputs)
对于每个批次,我们将模型的输出(预测值)与实际标签进行比较。为了简单地解释,我们检查模型预测的猫形象是否实际上是一只猫。如果所有的预测都是正确的,那么我们的模型就是好的。但是如果模型将狗识别为猫,那么我们就有一个错误。这就是损失函数的计算结果。
损失函数将我们的模型得出的预测分数与真实目标或标签进行比较,并给出一些量化值,用于判断这些预测对训练图像的好坏程度。
criterion = nn.NLLLoss()
logps = model.forward(inputs)
batch_loss = criterion(logps, labels)
我们可以使用不同类型的损失函数。选择最佳损失函数取决于各种因素以及我们尝试解决的问题类型,例如回归或分类。在本教程中,我们将使用NLLLoss函数。
我们如何使这个错误最小化?
一旦计算出损失,下一步就是决定是否继续训练。该决定基于损失值,如果损失值很高,那么我们需要更新模型的权重参数并重复相同的过程。如果损失很小并且满足我们的需求,那么我们将停止训练过程。
基于计算出的误差,优化函数用于使用梯度下降和反向传播来优化权重。
#compute the gradients
loss.backward()
#update the parameters
optimizer.step()
这样,我们修改模型的权重参数,并重复同样的过程,直到损失减少到最小。
输出
我们已经完成了模型的训练部分,计算出的每个 batch 的损失如下:
总结
本教程的主要目的是给出误差计算和损失函数的详细说明,而不是如何训练一个模型。在对模型进行训练的同时,对误差计算和优化步骤进行了详细的检验和观察。然而,本教程并没有解释神经网络训练过程中涉及到的所有步骤。我希望这篇教程能够帮助你理解损失函数在神经网络中的重要性和作用。
· END ·
HAPPY LIFE