【发布时间】:2017-08-15 17:05:07
【问题描述】:
我想计算没有循环的 SVM 的损失。但我无法做到正确。需要一些启发。
和
def svm_loss_vectorized(W, X, y, reg):
loss = 0.0
scores = np.dot(X, W)
correct_scores = scores[y]
deltas = np.ones(scores.shape)
margins = scores - correct_scores + deltas
margins[margins < 0] = 0 # max -> Boolean array indexing
margins[np.arange(scores.shape[0]), y] = 0 # Don't count j = yi
loss = np.sum(margins)
# Average
num_train = X.shape[0]
loss /= num_train
# Regularization
loss += 0.5 * reg * np.sum(W * W)
return loss
它应该输出与以下函数相同的损失。
def svm_loss_naive(W, X, y, reg):
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
loss /= num_train # mean
loss += 0.5 * reg * np.sum(W * W) # l2 regularization
return loss
【问题讨论】:
-
输入的形状是什么?
-
W.shape=(3073, 10) , X.shape=(500,3073), y.shape(500,)
标签: python numpy machine-learning vectorization svm