在lambda函数中,"_"代表一个占位符,用于表示一个不需要使用的参数。它被用于忽略某个参数,因为有时候在lambda函数中定义的参数是必须的,但在某些情况下又不需要使用它。通过使用"_"作为占位符,可以明确地表示这个参数是不需要的,从而提高代码的可读性。

8 浏览
0 Comments

在lambda函数中,"_"代表一个占位符,用于表示一个不需要使用的参数。它被用于忽略某个参数,因为有时候在lambda函数中定义的参数是必须的,但在某些情况下又不需要使用它。通过使用"_"作为占位符,可以明确地表示这个参数是不需要的,从而提高代码的可读性。

我有一个带有"_"作为参数的匿名函数,我不知道它代表什么意思,也不知道为什么它在这里被使用。

函数如下:

f = lambda _: model.loss(X, y)[0]

grad_num = eval_numerical_gradient(f, model.params[name], verbose=False, h=1e-5)

model.loss:

def loss(self, X, y=None):
    # 从params字典中解包变量
    W1, b1 = self.params['W1'], self.params['b1']
    W2, b2 = self.params['W2'], self.params['b2']
    h1, h1_cache = affine_relu_forward(X, W1, b1)
    scores, h2_cache = affine_forward(h1, W2, b2)
    # 如果y为None,则处于测试模式,只返回scores
    if y is None:
        return scores
    loss, grads = 0, {}
    loss, dscores = softmax_loss(scores, y)
    loss = loss + 0.5*self.reg*(np.sum(W2**2) + np.sum(W1**2))
    dh1, grads['W2'], grads['b2'] = affine_backward(dscores,h2_cache)
    dX, grads['W1'], grads['b1'] = affine_relu_backward(dh1,h1_cache)
    grads['W1'] += self.reg*W1
    grads['W2'] += self.reg*W2
    return loss, grads

和函数

eval_numerical_gradient:

def eval_numerical_gradient(f, x, verbose=True, h=0.00001):
    fx = f(x) # 在原始点评估函数值
    grad = np.zeros_like(x)
    # 遍历x中的所有索引
    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
    while not it.finished:
        # 在x+h处评估函数
        ix = it.multi_index
        oldval = x[ix]
        x[ix] = oldval + h # 增加h
        fxph = f(x) # 评估f(x + h)
        x[ix] = oldval - h
        fxmh = f(x) # 评估f(x - h)
        x[ix] = oldval # 恢复
        # 使用中心公式计算偏导数
        grad[ix] = (fxph - fxmh) / (2 * h) # 斜率
        if verbose:
            print(ix, grad[ix])
        it.iternext() # 前进到下一个维度
    return grad

损失函数并不复杂,我想知道"_"代表什么,并且了解其中的函数。

0
0 Comments

在lambda函数中,下划线(_)的含义是告诉其他开发者这个参数是不会被使用的。这是一种python的约定。开发者使用下划线来提高代码的可读性。一些IDE(例如PyCharm)会在不使用下划线的情况下发出警告,但使用下划线则不会。

为什么不能只调用`def test(): print('foobar')`?

这只是一个示例,用来展示IDE的行为。当然你可以这样做。更好的示例可能是使用for循环:`for _ in range(10): print('hello')`,但这需要更多的代码行数,我希望答案简洁明了。

总之,下划线在lambda函数中的使用是为了告诉其他开发者这个参数不会被使用,并且一些IDE也会根据这个约定给出警告。这是一种python的编码习惯,让代码更易读。

0
0 Comments

在Lambda函数中,下划线 "_" 的含义是一个通常用于不会在后续使用的变量的约定。它没有任何黑魔法,只是一个普通的变量名,其行为与预期完全一致。

在这种情况下,它被使用是因为 "f" 被作为一个回调函数传递,当它被调用时会传入一个参数("fxph = f(x)")。

如果 "f" 被实现为下面的形式:

f = lambda: model.loss(X, y)[0]

那么将会引发错误 "TypeError: () takes 0 positional arguments but 1 was given"。

所以,f 可以是 f(X,y),也可以是 f(X),因为传递参数 "y = None" 吗?

是的,但这与问题无关。如果 lambda 不接受 "_",那么调用 "fxph = f(x)" 将会失败,错误信息如我在答案中展示的那样。

我对 "f = lambda x,y: x+y" 感到困惑,好吧,那么我知道我可以调用 "f(1,2)"。如果我使用 "f = lambda _:x+y",该如何调用它?

这不是一个重复的问题,更不用说一个 "显而易见" 的问题了。在那里的任何答案都没有解释为什么在这个特定的用例中使用 "_"。

我不理解你的问题。"f" 已经被调用了("fxph = f(x)")。

如果我为了方便使用 "_",那么 IDE 怎么知道我想要调用哪个参数?因为它有两个可以传递给损失函数的参数。

IDE 和解释器并不关心这个。他们只关心 "f" 会接受一个参数。他们不关心 "f" 如何在内部调用该参数,甚至是否使用它。

如果我想要使用 "f = lambda _: x + y" 以方便使用,并调用 "f(1,2)",会引发错误。我还是不知道如何在 Lambda 函数中使用 "_"。

在这个上下文中,名称 "_" 没有任何特殊之处。它与 "f = lambda ignored_argument: x + y" 是相同的。

再说一遍,"_" 没有特殊含义。"_ = 1" 和 "x = 1" 是完全相同的。你会得到一个错误,是因为你定义了一个只接受一个参数的函数,但你传递了两个参数。

我明白了!!!它改变了 "loss 方法" 的母类中的 "self.params"。然后再次调用该方法!非常感谢您的教导和耐心!

0