在lambda函数中,"_"代表一个占位符,用于表示一个不需要使用的参数。它被用于忽略某个参数,因为有时候在lambda函数中定义的参数是必须的,但在某些情况下又不需要使用它。通过使用"_"作为占位符,可以明确地表示这个参数是不需要的,从而提高代码的可读性。
在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
损失函数并不复杂,我想知道"_"代表什么,并且了解其中的函数。
在lambda函数中,下划线(_)的含义是告诉其他开发者这个参数是不会被使用的。这是一种python的约定。开发者使用下划线来提高代码的可读性。一些IDE(例如PyCharm)会在不使用下划线的情况下发出警告,但使用下划线则不会。
为什么不能只调用`def test(): print('foobar')`?
这只是一个示例,用来展示IDE的行为。当然你可以这样做。更好的示例可能是使用for循环:`for _ in range(10): print('hello')`,但这需要更多的代码行数,我希望答案简洁明了。
总之,下划线在lambda函数中的使用是为了告诉其他开发者这个参数不会被使用,并且一些IDE也会根据这个约定给出警告。这是一种python的编码习惯,让代码更易读。
在Lambda函数中,下划线 "_" 的含义是一个通常用于不会在后续使用的变量的约定。它没有任何黑魔法,只是一个普通的变量名,其行为与预期完全一致。
在这种情况下,它被使用是因为 "f" 被作为一个回调函数传递,当它被调用时会传入一个参数("fxph = f(x)")。
如果 "f" 被实现为下面的形式:
f = lambda: model.loss(X, y)[0]
那么将会引发错误 "TypeError:
所以,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"。然后再次调用该方法!非常感谢您的教导和耐心!