CS231n-线性SVM分类Cifar10

本文详细介绍了如何使用线性SVM对CIFAR10数据集进行分类。从目标函数、代价函数(包含正则项和折叶损失)、梯度计算到模型的训练和预测函数,逐一深入讲解。最后通过自动化确定超参数并训练模型,得到测试集准确率约为37%。

线性分类器其实我已经接触不少了,不同于KNN,它涉及到了更多的知识,比如cost function, objective function等,svm涉及到的知识确实比较多且难理解,但当我们得到相应公式后其实实现起来并不算繁琐,相反很容易理解

线性SVM

目标函数

目标函数我们在以前的线性回归,逻辑回归中都见到过

目标函数

代价函数

SVM的代价函数想要SVM在正确分类上的得分始终比不正确分类上的得分高出一个边界值delta, 所以它的代价函数如下:

代价函数

即在确定正确分类的分数(scores[y[i]])后,其他分类上的分数都要减去它并且加上一个边界值 ( scores[y[!i] - screos[y[i]] + delta ),当得到的值小于0时则代表正确分类比不正确分类高出了一个边界值,否则则要计算损失值。 比如,假设有3个分类,并且得到了分值[13, -7, 11], 第一个分类为正确分类,delta为10,那么根据代价函数,我们可以得到以下算式

计算公式

以上代价函数计算公式称为折叶损失(hinge loss),当然除此之外还有平方折叶损失SVM(即L2-SVM),就是加个平方,我们可以通过交叉验证或者验证集来确定到底选用哪个

正则项

在ML中,过拟合问题一直是影响模型准确率的重大因素,所以我们还要加上L2范式正则项(在这里,正则项还确保了SVM有最大边界(max margin)等好处),所以最终我们得到以下整个代价函数公式

完整代价函数

梯度计算

在训练过程中,我们需要通过最优化方法来是代价函数的损失值达到尽可能的小,所以我们对代价函数进行微分,然后计算其偏导数,得到以下公式

对于每一个训练样本,我们计算它在每个分类上的得分,每当它在某一分类产生了损失(即scores[y[!i] - screos[y[i]] + delta > 0),那么我们就将该分类上的参数梯度+Xi

错误分类的参数梯度计算

同时正确分类(y[i])的参数梯度-Xi

正确分类的参数梯度计算

再简单的说就是,对于每个Xi,每一个会产生损失值的分类(scores[y[!i] - screos[y[i]] + delta > 0)都会将其参数梯度+Xi,同时在正确分类(y[i])上的梯度-Xi

将以上的公式转化成代码,用非向量化实现(更容易理解)如下

def svm_loss_naive(W, X, y, reg):
  """
  Structured SVM loss 
基于SVMCIFAR-10图像分类算法通常涉及以下步骤:数据加载与预处理、定义SVM模型、训练模型以及评估性能。以下是完整的实现代码,结合了您提到的需求和相关引用内容。 ### 数据加载与预处理 ```python import numpy as np import pickle import os from cs231n.data_utils import load_CIFAR10 def load_data(): """ Load CIFAR-10 data and preprocess it. """ cifar10_dir = 'cs231n/datasets/cifar-10-batches-py' # Load the raw CIFAR-10 data X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir) # Subsample the data for faster training num_training = 5000 mask = range(num_training) X_train = X_train[mask] y_train = y_train[mask] num_test = 500 mask = range(num_test) X_test = X_test[mask] y_test = y_test[mask] # Reshape the image data into rows X_train = X_train.reshape(X_train.shape[0], -1) X_test = X_test.reshape(X_test.shape[0], -1) # Normalize the data: subtract the mean image mean_image = np.mean(X_train, axis=0) X_train -= mean_image X_test -= mean_image # Add bias dimension X_train = np.hstack([X_train, np.ones((X_train.shape[0], 1))]) X_test = np.hstack([X_test, np.ones((X_test.shape[0], 1))]) return X_train, y_train, X_test, y_test ``` ### 定义线性SVM模型 ```python from cs231n.classifiers import LinearSVM # Load the data X_train, y_train, X_test, y_test = load_data() ``` ### 训练SVM模型 ```python import time # Train the SVM classifier svm = LinearSVM() tic = time.time() loss_hist = svm.train(X_train, y_train, learning_rate=1e-7, reg=2.5e4, num_iters=1500, verbose=True) toc = time.time() print('That took %fs' % (toc - tic)) ``` ### 模型预测与性能评估 ```python # Predict labels on the training set y_train_pred = svm.predict(X_train) train_accuracy = np.mean(y_train == y_train_pred) print('Training accuracy: %f' % train_accuracy) # Predict labels on the validation/test set y_test_pred = svm.predict(X_test) test_accuracy = np.mean(y_test == y_test_pred) print('Test accuracy: %f' % test_accuracy) ``` ### 可视化损失曲线(可选) ```python import matplotlib.pyplot as plt # Plot the loss history plt.plot(loss_hist) plt.xlabel('Iteration number') plt.ylabel('Loss value') plt.title('Loss History') plt.show() ``` ### 说明 - **数据加载**:通过`load_CIFAR10`函数从指定路径加载CIFAR-10数据集。 - **预处理**:包括数据子采样、归一化、添加偏置项等操作,以提高模型训练效率[^4]。 - **模型定义与训练**:使用`LinearSVM`类实现线性支持向量机,并通过梯度下降优化损失函数[^1]。 - **性能评估**:通过计算准确率来衡量模型在训练集和测试集上的表现[^3]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值