【问题标题】:implementing softmax method in python在python中实现softmax方法
【发布时间】:2019-01-24 08:52:23
【问题描述】:

我正在尝试从 lightaime 的 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

【问题讨论】:

    标签: python machine-learning softmax


    【解决方案1】:

    这个表达式的意思是:对一个形状为(N, C)的数组softmax_output进行切片,只从中提取与训练标签y相关的值。

    二维numpy.array 可以用两个包含适当值的列表进行切片(即它们不应导致索引错误)

    range(num_train) 为第一个轴创建一个索引,允许在第二个索引 list(y) 的每一行中选择特定值。你可以在numpy documentation for indexing找到它。

    第一个索引 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, 7, 12]
    

    所以,它从第一行中选择第三个元素,从第二行中选择第二个元素,等等。这就是它的工作原理。

    (p.s. 我是否误解了你,你对“为什么”感兴趣,而不是“如何”?)

    【讨论】:

      【解决方案2】:

      这里的损失由以下等式定义

      这里,对于数据点所属的类,y 为 1,对于所有其他类,y 为 0。因此,我们只对数据点类的 softmax 输出感兴趣。因此上式可以改写为

      因此下面的代码代表上面的等式。

      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) 代表各个类别。

      Mikhail 在他的回答中很好地解释了这个索引。

      【讨论】:

        猜你喜欢
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 2020-05-05
        相关资源
        最近更新 更多