在PyTorch中实现SVM分类器

在PyTorch中,SVM可以通过定义一个类来实现。下面是一个基于PyTorch的SVM的示例代码:


import torch
import torch.nn as nn
import torch.optim as optim

class SVM(nn.Module):
    def __init__(self, input_size, num_classes):
        super(SVM, self).__init__()
        self.linear = nn.Linear(input_size, num_classes)

    def forward(self, x):
        return self.linear(x)

#定义训练数据
x_train = torch.tensor([[1., 1.], [-1., 1.], [-1., -1.], [1., -1.]])
y_train = torch.tensor([1., -1., -1., -1.])

# 定义SVM模型
svm = SVM(input_size=2, num_classes=1)
criterion = nn.HingeEmbeddingLoss()
optimizer = optim.SGD(svm.parameters(), lr=0.01)

#训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    optimizer.zero_grad()
    outputs = svm(x_train)
    loss = criterion(outputs.squeeze(), y_train)
    loss.backward()
    optimizer.step()

#测试模型
x_test = torch.tensor([[2., 2.], [-2., 2.], [-2., -2.], [2., -2.]])
outputs = svm(x_test)
predicted = torch.sign(outputs).squeeze()
print(predicted)

在上面的代码中,我们首先定义了一个SVM类,它包括一个线性层和一个前向传递方法。然后我们定义了训练数据x_train和y_train。接着,我们实例化了SVM类,并定义了损失函数和优化器。在训练过程中,我们使用optimizer.zero_grad()方法清除梯度,计算输出和损失,然后通过调用optimizer.step()方法更新参数。最后,我们使用x_test测试数据进行预测,并将输出通过torch.sign()方法转换为-1或1的值。

需要注意的是,在这个示例中,我们使用了HingeEmbeddingLoss作为损失函数,因为它是SVM的标准损失函数。另外,我们将输出的维度设置为1,因为这是二分类问题,输出值应该是1或-1。

猜你喜欢

转载自blog.csdn.net/qq_41563601/article/details/129420861