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 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:
dW[:,j] += X[i].T
dW[:,y[i]] -= X[i].T
loss += margin
# 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
dW += reg*2*W
# Add regularization to the loss.
loss += reg * np.sum(W * W)
def svm_loss_vectorized(W, X, y, reg):
"""
Structured SVM loss function, vectorized implementation.
Inputs and outputs are the same as svm_loss_naive.
"""
loss = 0.0
dW = np.zeros(W.shape)# initialize the gradient as zero
num_train = X.shape[0]
results = X.dot(W)
correct_results = results[np.arange(num_train),y]#一维
correct_results = np.reshape(correct_results,(num_train,-1))#二维
results_modify = results - correct_results + 1
results_modify = np.maximum(0,results_modify)
results_modify[np.arange(num_train),y] = 0
loss += np.sum(results_modify)
loss /= num_train
loss += reg * np.sum(W*W)
#向量化计算的骚套路
results_modify[results_modify>0] = 1#计算贡献次数
row = np.sum(results_modify,axis=1)#当loss大于0时,正确的类别的梯度需要计算的贡献次数
#print(row.T.shape)
results_modify[np.arange(num_train),y] = -row.T#正确的类别
#print(results_modify[np.arange(num_train),y])
dW = (X.T).dot(results_modify)
dW /= num_train
dW += reg*2*W
pass
# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
return loss, dW
#end