Невозможно получить правильный SVM-градиент, используя векторизацию

Я пытался использовать CS231n Assignment 1 для векторизации вычисления SVM-градиентов. dW - матрица градиента. Следующее - моя попытка:

def svm_loss_vectorized(W, X, y, reg):

  num_train = X.shape[0]
  loss = 0.0
  dW = np.zeros(W.shape) # initialize the gradient as zero

  scores = X.dot(W)
  margins = np.maximum(0, scores - scores[y] + 1)
  margins[y] = 0

  # indices gets the position in the margins matrix where entry is > 0
  indices = np.argwhere(margins > 0)
  i = indices[:, 0]
  j = indices[:, 1]

  dW[:, j] += np.transpose(X[i])
  dW[:, y[i]] -= np.transpose(X[i])
  loss = np.sum(margins)

  # average it
  loss /= num_train
  dW /= num_train

  # regularization
  loss += reg * np.sum(W * W)
  dW += reg * W

  return loss, dW

Мои расчеты потерь верны, однако рассчитанный градиент отклоняется с огромным запасом. Может ли кто-нибудь помочь мне понять, что мне здесь не хватает?

0 ответов

Другие вопросы по тегам