最近学习了斯坦福的CS231n(winter 2016)系列课程,收获很大,作为深度学习以及卷积神经网络学习的入门很是完美。学习过程中,主要参考了知乎上几位同学的课程翻译,做得很好,在这里也对他们表示感谢,跟课程相关的很多资源都可以在该专栏中找到。推荐大家把每个笔记的翻译都完整的看一下。关于该课程视频的中文字幕也在翻译进行中,目前第一集已经翻译完成,感兴趣的同学可以也可以看看参与进去。此外,完成课程视频和笔记的阅读之后也对课程的3个Assignment进行了实现。接下来主要以对课程笔记总结和Assignment代码实现相结合的方式完成这一系列的博客。
本篇博客主要对Assignment1中的linear_svm、softmax、linear_classifier三个任务进行实现。在该页面中提供了任务初始代码下载 下载的代码中已经有了相关文件。我们只需要按照svm.ipynb和softmax.ipynb两个文件来一步步地做。关于numpy中一些数组、向量、矩阵的操作可以参见该教程(介绍了如何从矩阵中选取特定位置处的元素等等接下来会用到的操作)
这里我直接贴出自己的代码,相关注释已经下载文件之中:
1,linear_svm.py
import numpy as np
def svm_loss_naive(W, X, y, reg):
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 xrange(num_train):
#计算得分,点乘
scores = X[i].dot(W)
#记录正确类别的得分
correct_class_score = scores[y[i]]
#遍历C个类别
for j in xrange(num_classes):
if j == y[i]:
continue
#计算折页损失,和梯度公式。公式推导在上篇博客中已经介绍过了
margin = scores[j] - correct_class_score + 1 # note delta = 1
if margin > 0:
loss += margin
dW[:, y[i]] += -X[i, :] # compute the correct_class gradients
dW[:, j] += X[i, :] # compute the wrong_class gradients
# 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
# Add regularization to the loss.添加正则损失
loss += 0.5 * reg * np.sum(W * W)
dW += reg * W
return loss, dW
#使用向量运算计算loss和梯度
def svm_loss_vectorized(W, X, y, reg):
loss = 0.0
dW = np.zeros(W.shape) # initialize the gradi