реализация метода softmax в python - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь понять этот код со страницы Github на Лайтхейме.Это проверенный метод softmax.Что меня смущает, так это "softmax_output [range (num_train), list (y)]"

Что означает это выражение?

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


    """
    Softmax loss function, vectorize implementation
    Inputs have dimension D, there are C classes, and we operate on minibatches of N examples.

    Inputs:
        W: A numpy array of shape (D, C) containing weights.
        X: A numpy array of shape (N, D) containing a minibatch of data.
        y: A numpy array of shape (N,) containing training labels; y[i] = c means that X[i] has label c, where 0 <= c < C.
        reg: (float) regularization strength

    Returns a tuple of:
        loss as single float
        gradient with respect to weights W; an array of same shape as W
    """

    # Initialize the loss and gradient to zero.
    loss = 0.0
    dW = np.zeros_like(W)


    num_classes = W.shape[1]
    num_train = X.shape[0]
    scores = X.dot(W)
    shift_scores = scores - np.max(scores, axis = 1).reshape(-1,1)
    softmax_output = np.exp(shift_scores)/np.sum(np.exp(shift_scores), axis = 1).reshape(-1,1)
    loss = -np.sum(np.log(softmax_output[range(num_train), list(y)]))   
    loss /= num_train 
    loss +=  0.5* reg * np.sum(W * W)

    dS = softmax_output.copy()
    dS[range(num_train), list(y)] += -1
    dW = (X.T).dot(dS)
    dW = dW/num_train + reg* W
    return loss, dW

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Потери здесь определяются следующим уравнением

enter image description here

Здесь y равно 1 для класса, которому принадлежит точка данных, и 0 для всех других классов. Таким образом, мы заинтересованы только в выводах softmax для класса datapoint. Таким образом, вышеприведенное уравнение можно переписать как

enter image description here

Таким образом, затем следующий код, представляющий вышеприведенное уравнение.

loss = -np.sum(np.log(softmax_output[range(num_train), list(y)]))

Код softmax_output[range(num_train), list(y)] используется для выбора выходов softmax для соответствующих классов. range(num_train) представляет все обучающие образцы, а list(y) представляет соответствующие классы.

Этот индекс хорошо объяснил Михаил в своем ответе.

0 голосов
/ 24 января 2019

Это выражение означает: нарезать массив softmax_output формы (N, C), извлекая из него только значения, относящиеся к обучающим меткам y.

Двумерные numpy.array можно разрезать с помощью двух списков, содержащихсоответствующие значения (т. е. они не должны вызывать ошибку индекса)

range(num_train) создает индекс для первой оси, который позволяет выбирать конкретные значения в каждой строке со вторым индексом - list(y).Вы можете найти его в документации numpy для индексирования .

Первый индекс range_num имеет длину, равную первому измерению softmax_output (= N).Он указывает на каждую строку матрицы;затем для каждой строки он выбирает целевое значение через соответствующее значение из второй части индекса - list(y).

Пример:

softmax_output = np.array(  # dummy values, not softmax
    [[1, 2, 3], 
     [4, 5, 6],
     [7, 8, 9],
     [10, 11, 12]]
)
num_train = 4  # length of the array
y = [2, 1, 0, 2]  # a labels; values for indexing along the second axis
softmax_output[range(num_train), list(y)]
Out:
[3, 5, 0, 12]

Итак, он выбирает третий элемент из первой строки,второй из второго ряда и т. д. Вот как это работает.

(п.с. Я вас неправильно понимаю, а вы интересуетесь «почему», а не «как»?)

...