欢迎访问宙启技术站
智能推送

Python中关于Layers分类损失函数的对比实验分析

发布时间:2023-12-16 05:02:47

在深度学习中,分类损失函数用于计算模型在分类任务中的误差。常见的分类损失函数包括交叉熵损失函数、Hinge损失函数和softmax损失函数。接下来,我们将分别介绍这些分类损失函数,并进行对比实验分析。

1. 交叉熵损失函数(Cross Entropy Loss):

交叉熵损失函数是在分类任务中最常用的损失函数之一。它使用对数似然来度量模型输出和真实标签之间的差异。可以用以下公式表示:

L = - ∑ ylog(p)

其中,y表示真实标签的独热编码,p表示模型的输出概率。

2. Hinge损失函数:

Hinge损失函数常用于支持向量机(SVM)中。它基于最大间隔的原理,鼓励正确分类的预测与其他类别的预测之间具有更大的间隔。可以用以下公式表示:

L = ∑ max(1-yp, 0)

其中,y表示真实标签的{-1, 1}编码,p表示模型的输出。

3. softmax损失函数:

softmax损失函数是一种在多分类问题中常用的损失函数。它通过将模型的输出转化为概率分布,来度量模型输出和真实标签之间的差异。可以用以下公式表示:

L = - ∑ ylog(p)

其中,y表示真实标签的独热编码,p表示模型的输出概率。

下面通过一个具体的例子,来比较这三种分类损失函数的效果。

假设我们有一个简单的二分类问题,需要将输入样本分为类别A和类别B。我们使用三层的全连接神经网络作为模型,其中隐藏层的激活函数为ReLU。训练集共包含1000个样本,测试集包含100个样本。

首先,我们使用交叉熵损失函数进行训练和测试。代码如下:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

# 生成数据
np.random.seed(0)
X = np.random.randn(1000, 10)
Y = np.random.randint(0, 2, (1000,))
Y_onehot = np.zeros((1000, 2))
Y_onehot[np.arange(1000), Y] = 1
X_test = np.random.randn(100, 10)
Y_test = np.random.randint(0, 2, (100,))
Y_test_onehot = np.zeros((100, 2))
Y_test_onehot[np.arange(100), Y_test] = 1

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 10)
        self.fc2 = nn.Linear(10, 2)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = Net().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# 训练模型
for epoch in range(100):
    inputs = torch.from_numpy(X).float().to(device)
    labels = torch.from_numpy(Y).long().to(device)
  
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

# 测试模型
model.eval()
inputs = torch.from_numpy(X_test).float().to(device)
labels = torch.from_numpy(Y_test).long().to(device)
with torch.no_grad():
    outputs = model(inputs)
    _, predicted = torch.max(outputs.data, 1)
    accuracy = (predicted == labels).sum().item() / labels.size(0)
    print('Accuracy:', accuracy)

接下来,我们使用Hinge损失函数进行训练和测试。代码如下:

criterion = nn.HingeEmbeddingLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# 训练模型
for epoch in range(100):
    inputs = torch.from_numpy(X).float().to(device)
    labels = 2 * torch.from_numpy(Y).float() - 1
  
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

# 测试模型
model.eval()
inputs = torch.from_numpy(X_test).float().to(device)
labels = 2 * torch.from_numpy(Y_test).float() - 1
with torch.no_grad():
    outputs = model(inputs)
    predicted = torch.sign(outputs)
    accuracy = (predicted == labels).sum().item() / labels.size(0)
    print('Accuracy:', accuracy)

最后,我们使用softmax损失函数进行训练和测试。代码如下:

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# 训练模型
for epoch in range(100):
    inputs = torch.from_numpy(X).float().to(device)
    labels = torch.from_numpy(Y).long().to(device)
  
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

# 测试模型
model.eval()
inputs = torch.from_numpy(X_test).float().to(device)
labels = torch.from_numpy(Y_test).long().to(device)
with torch.no_grad():
    outputs = model(inputs)
    _, predicted = torch.max(outputs.data, 1)
    accuracy = (predicted == labels).sum().item() / labels.size(0)
    print('Accuracy:', accuracy)

通过运行以上代码,我们可以得到交叉熵损失函数、Hinge损失函数和softmax损失函数对应的模型在测试集上的准确率。根据实验结果可以进行对比分析,比较三种分类损失函数的优劣。