可以参考:cs231n assignment1 SVM 完整代码

231n作业   多类 SVM 的损失函数及其梯度计算(最好)https://blog.csdn.net/NODIECANFLY/article/details/82927119  (也不错)

作业部分:

完成结构化SVM的损失梯度的理论计算

完成梯度计算的循环形式的代码 svm_loss_naive

完成向量化梯度计算的代码 svm_loss_vectorized

完成随机梯度下降法的代码,在linear_classifier.py文件的 SGDLinearClassifier.train()函数中

其中对多分类SVM损失函数的推导先不赘述,最后得到一个对N个样本计算梯度并返回梯度与损失的矩阵,梯度部分如下:

def svm_loss_naive(W, X, y, reg):
"""
Structured SVM loss function, naive implementation (with loops). Inputs have dimension D, there are C classes, and we operate on minibatches
of N examples. Inputs:
- W: A numpy array of shape (D, C) containing weights.
- X: A numpy array of shape (N, D) containing a minibatch of data.
- y: A numpy array of shape (N,) containing training labels; y[i] = c means
that X[i] has label c, where 0 <= c < C.
- reg: (float) regularization strength Returns a tuple of:
- loss as single float
- gradient with respect to weights W; an array of same shape as W
"""
dW = np.zeros(W.shape) # initialize the gradient as zero # compute the loss and the gradient
num_classes = W.shape[1]
num_train = X.shape[0]
loss = 0.0
for i in range(num_train):
scores = X[i].dot(W)
correct_class_score = scores[y[i]]
for j in range(num_classes):
if j == y[i]:
continue
margin = scores[j] - correct_class_score + 1 # note delta = 1
if margin > 0:
loss += margin
dW[:,j]+=X[i] #数据分类错误时的梯度
dW[:,y[i]]-=X[i] #数据分类正确时的梯度,所有非正确的累减 # Right now the loss is a sum over all training examples, but we want it
# to be an average instead so we divide by num_train.
loss /= num_train
dW /=num_train
# 加上正则项的部分:reg?
loss += reg * np.sum(W * W)
dW+=reg*np.sum(W) #reg是正则化强度的量 #############################################################################
# TODO: #
# Compute the gradient of the loss function and store it dW. #
# Rather that first computing the loss and then computing the derivative, #
# it may be simpler to compute the derivative at the same time that the #
# loss is being computed. As a result you may need to modify some of the #
# code above to compute the gradient. #
############################################################################# return loss, dW

写完损失后:进行几个步骤

图像预处理

通常我们会将所有图片,包括训练数据和待分类数据,减去图片每个位置像素的均值,使得数据中心化,这样可以提高模型的效果。同时,也可以对中心化后的数据归一化处理,使其分布在[-1, 1]区间,进一步优化模型效果。

小批量数据梯度下降(Mini-batch gradient descent)

相比于每次拿一个样例数据进行梯度更新,每次使用一个小批量数据进行梯度更新能够更好的避免单个样本数据的扰动,可以显著提高模型训练的效率,损失的变化更加平滑,使得模型更快的收敛。具体操作方法是一次计算一个批量的数据的结果,如256个样本,计算每个结果下权重矩阵每个变量的梯度。对于每个权重分量,累加256个梯度值,求均值作为该分量的梯度,更新该分量。

梯度下降和梯度检验

对求得的理论梯度与数值梯度进行对比,确认没有问题后进行计算:

理论梯度:

数值梯度:

梯度数值解的计算很简单,根据下面梯度的公式,在给定的样本和权重矩阵下,计算输出,然后让权重矩阵的变量发生微小的变化,再计算输出,两次输出的差值除以变化量就是权重矩阵的梯度:

向量化的计算:

def svm_loss_vectorized(W, X, y, reg):
"""
Structured SVM loss function, vectorized implementation.
#计算向量化计算损失和梯度
Inputs:输入都为numpy array
- W: 形状为(D, C)的权重矩阵,3073x10
- X: 形状为(N, D)的小批量数据,200x3073
- y: 形状为(N,)的标签向量,200,由以上关系可得XW为所有样本的得分,第i行为样本i的得分,XW的第ij个元素
即为样本i在第j个分类的得分; y[i] = c means that X[i] has label c, where 0 <= c < C.
- reg: (float) 正则化损失系数(无法通过拍脑袋设定,需要多试几个值,交叉验证,然后找个最优的) 变量说明:
delta:超参数,SVM的间隔,一般取1
"""
num_train=X.shape[0] #X形状的第0个参数,由说明可知是N为小批量样本数200
num_classes=X.shape[1]
loss = 0.0
dW = np.zeros(W.shape) # 零初始化的梯度矩阵DxC
delta=1
"""
patch_X=X # 200X3073
patch_y=y # 200
"""
#############################################################################
# TODO: 计算loss #
# Implement a vectorized version of the structured SVM loss, storing the #
# result in loss. #
#############################################################################
scores=X.dot(W) #所有样本的得分情况200x10(NxC)
scores_y=scores[range(num_train),y] # 其中num_train和y的size都是N,每一个样本正确分类的得分(1xN)向量
scores_y=np.reshape(scores_y,(num_train,1)) #得到Nx1的矩阵,便于下面广播
margins =np.maximum(0,scores-scores_y+delta) #Nxc矩阵,第i行的C个元素为样本i对于第j类的hinge loss
margins[range(num_train),y]=0 #将label所在误差置0
loss+=np.sum(margins)/num_train #计算损失data loss 部分
print(loss)
loss+= 0.5*reg * np.sum(W * W) #加上正则项 0.5为了平衡W平方求导后的2
#############################################################################
# END OF YOUR CODE #
############################################################################# #############################################################################
# TODO: 计算梯度dW #
# Implement a vectorized version of the gradient for the structured SVM #
# loss, storing the result in dW. #
# #
# Hint: Instead of computing the gradient from scratch, it may be easier #
# to reuse some of the intermediate values that you used to compute the #
# loss. #
#############################################################################
margins[margins>0]=1.0 #取大于0的为1,便于计算梯度
row_sum=-np.sum(margins,1) #对每一行不为0的margins求和,用来计算正确分类项的梯度,即该列为减去所有非正确项的特征累加
margins[range(num_train),y] =row_sum #N X C直接更改 margins正确部分的值
dW+=np.dot(X.T,margins)/num_train #x为NxD
dW+=reg*W
#############################################################################
# END OF YOUR CODE #
############################################################################# return loss, dW

验证没有问题之后可以进行训练。

【cs231n作业笔记】二:SVM分类器的更多相关文章

  1. 【cs231n作业笔记】一:KNN分类器

    安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...

  2. cs231n笔记:线性分类器

    cs231n线性分类器学习笔记,非完全翻译,根据自己的学习情况总结出的内容: 线性分类 本节介绍线性分类器,该方法可以自然延伸到神经网络和卷积神经网络中,这类方法主要有两部分组成,一个是评分函数(sc ...

  3. cs231n学习笔记(二)图像分类

    图像分类可说是计算机视觉中的基础任务同时也是核心任务,做好分类可为检测,分割等高阶任务打好基础. 本节课主要讲了两个内容,K近邻和线性分类器,都是以猫的分类为例. 一. K近邻 以猫的分类为例,一张含 ...

  4. CS231n课程笔记翻译8:神经网络笔记 part3

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Neural Nets notes 3,课程教师Andrej Karpathy授权翻译.本篇教程由杜客翻译完成,堃堃和巩子嘉进行校对修改.译文含 ...

  5. CS231n官方笔记授权翻译总集篇发布

    CS231n简介 CS231n的全称是CS231n: Convolutional Neural Networks for Visual Recognition,即面向视觉识别的卷积神经网络.该课程是斯 ...

  6. CS231n课程笔记翻译9:卷积神经网络笔记

    译者注:本文翻译自斯坦福CS231n课程笔记ConvNet notes,由课程教师Andrej Karpathy授权进行翻译.本篇教程由杜客和猴子翻译完成,堃堃和李艺颖进行校对修改. 原文如下 内容列 ...

  7. CS231n课程笔记翻译7:神经网络笔记 part2

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Neural Nets notes 2,课程教师Andrej Karpathy授权翻译.本篇教程由杜客翻译完成,堃堃进行校对修改.译文含公式和代 ...

  8. CS231n课程笔记翻译6:神经网络笔记 part1

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Neural Nets notes 1,课程教师Andrej Karpathy授权翻译.本篇教程由杜客翻译完成,巩子嘉和堃堃进行校对修改.译文含 ...

  9. CS231n课程笔记翻译4:最优化笔记

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Optimization Note,课程教师Andrej Karpathy授权翻译.本篇教程由杜客翻译完成,堃堃和李艺颖进行校对修改.译文含公式 ...

随机推荐

  1. Rest_Framework常用插件

    1. 认证Authentication 可以在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest ...

  2. mybatis oracle 批量新增

    假定场景:批量导入用户信息 一般批量新增使用 SELECT … INSERT INTO 和 INSERT INTO … SELECT 我们这次使用第二种 一.先建一张用户信息表模拟批量导入用户信息 c ...

  3. C++编译器对属性的初始化检查远没有Java严格

    C++编译器对属性的初始化检查远没有Java严格// Java编译通过:class yy { public static void main(String[] args) { int i; Syste ...

  4. Windows 环境下安装redis 及其PHP Redis扩展

    1.安装Redis (1)这里选择在github官网上下载Redis,地址:Redis下载地址 下载压缩包(如下图),并解压到本地目录,我放在D:\redis (2)验证Redis安装是否成功打开命令 ...

  5. k3 cloud的单据存储在业务对象表中

    k3 cloud的单据存储在业务对象表中,表名为T_META_OBJECTTYPE,查询表名和对应的表: select FNAME,FBASEOBJECTID from T_META_OBJECTTY ...

  6. https://www.cnblogs.com/cncc/p/7804511.html?foxhandler=RssReadRenderProcessHandler

    https://www.cnblogs.com/cncc/p/7804511.html?foxhandler=RssReadRenderProcessHandler 一.本文主要是使用Costura. ...

  7. [译]送给 ES6 开发者的7个 hack

    关注原来的 JavaScript hacks,上面有一些新的好东西.2018 使用 JavaScript 写代码真的又变得有意思了! Hack #1 — 交换变量 使用数组结构来交换值 let a = ...

  8. 原生js实现深度克隆

    总体思路: 判断对象当中的值为引用值还是原始值 如果是引用值,判断是数组还是对象,如果是原始值直接copy 递归 注意:不要忘了排除null,因为typeof null = 'object' func ...

  9. KVC,KVO详解

    Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property ac ...

  10. 前端每日实战:12# 视频演示如何用纯 CSS 创作一种文字断开的交互特效

    效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/LmjNgL 可交互视频教程 此视频是可以交 ...