一、作业说明
CS231n的第三次作业,要求写一个基于softmax的多分类程序,实现cifar10的多分类功能,程序中应当体现损失函数计算、梯度计算、交叉验证选择参数、权重可视化等功能。
本次作业与第二次作业的基于svm分类要求基本相同,唯一区别在于惩罚函数用的是softmax函数。
二、背景知识
损失函数
损失函数分为两部分,前半部分的误差项和后半部分的正则项。前半部分的误差由模型的输出层进行softmax运算结合交叉熵损失函数得到。后半部分的正则项提升了模型的泛化性能,是正则项系数,本模型中,我们选用的是权重矩阵的F范数。
梯度计算
我们使用分析梯度计算方法。对于属于第类的输入样本,不考虑正则项,模型的loss关于W求梯度为
若为的F范数,
三、程序源码
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 14 16:23:45 2018
@author: Junpeng
"""
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_data(data, labels, num):
batch_index= np.random.randint(0, data.shape[0], num)
batch=data[batch_index].T
batch_labels=labels[batch_index]
return batch, batch_labels
def get_validation_set(k_fold, num_validation, training_data):
num_training=np.size(training_data, 0)
validation_set=random.sample(range(0,num_training),k_fold*num_validation)
validation_set=np.reshape(validation_set,[num_validation, k_fold])
return validation_set
#进行数据预处理(归一