一、作业说明
CS231n的第二次作业,要求写一个基于svm的多分类程序,实现cifar10的多分类功能,程序中应当体现损失函数计算、梯度计算、交叉验证选择参数、权重可视化等功能。
二、背景知识
损失函数
损失函数分为两部分,前半部分的误差项和后半部分的正则项
。前半部分的误差由正确类别的socre减去模型对每一类别输出的socre和一个“boundary”(这里设为1)得到。后半部分的正则项提升了模型的泛化性能,
是正则项系数,本模型中,
我们选用的是权重矩阵
的F范数。
梯度计算
我们使用分析梯度计算方法。对于属于第类的输入样本
,不考虑正则项,模型的loss关于W求梯度为
若为
的F范数,
超参数选择
模型中的超参数有两个。一个是正则项系数,一个是学习率learning rate。为确定两个参数合适的取值,我们使用交叉验证法。
权重可视化
计算socre的过程中,权重矩阵W的每一行与输入的特征向量做卷积。考虑到特征向量是由输入图片拉伸得到的。我们可以认为权重矩阵的每一行也是由一张图片拉伸得到的。通过对权重矩阵每一行做可视化,我们可以观察到权重矩阵的部分性质。
三、程序源码
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 13 09:52:31 2018
@author: wjp_ctt
"""
import numpy as np
import random
from matplotlib import pylab as plt
#读取cifar10数据
def unpickle(file):
import pickle
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict
def sample_training_da