- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在浏览 Daniel Nouri 的 tutorial关于使用 CNN 的面部识别,我遇到了一些我不理解的代码。 Daniel 正在定义一个在网络训练期间每次迭代结束时调用的类,它将决定训练是否应该提前停止:
class EarlyStopping(object):
def __init__(self, patience=100):
self.patience = patience
self.best_valid = np.inf
self.best_valid_epoch = 0
self.best_weights = None
def __call__(self, nn, train_history):
current_valid = train_history[-1]['valid_loss']
current_epoch = train_history[-1]['epoch']
if current_valid < self.best_valid:
self.best_valid = current_valid
self.best_valid_epoch = current_epoch
self.best_weights = nn.get_all_params_values()
elif self.best_valid_epoch + self.patience < current_epoch:
print("Early stopping.")
print("Best valid loss was {:.6f} at epoch {}.".format(
self.best_valid, self.best_valid_epoch))
nn.load_params_from(self.best_weights)
raise StopIteration()
这是有道理的,但是代码中的实际实现看起来像这样:
net8 = NeuralNet(
# ...
on_epoch_finished=[
AdjustVariable('update_learning_rate', start=0.03, stop=0.0001),
AdjustVariable('update_momentum', start=0.9, stop=0.999),
EarlyStopping(patience=200),
],
# ...
)
显然,Daniel 将类作为函数调用。但是,如果没有 __call__(args)
中显示的参数,我不明白他是如何调用它的。 nolearn 的源代码就是这样实现的吗?我很困惑网络如何知道使用 nn
和 train_history
而没有将它们传递给函数。
最佳答案
他没有使用 EarlyStopping(patience=200)
调用 __call__
,而是调用* EarlyStopping.__init__
签名为:
def __init__(self, patience=100):
并为patience
提供替代值;这完全匹配可用于 __init__
的参数。
EarlyStopping.__call__
实例被调用;也就是说,如果调用顺序是:
e = EarlyStopping(patience = 200)
e(patience=50) # TypeError Raised
将引发适当的错误。
*让您失望的括号实际上是在打电话。不是调用 EarlyStopping.__call__
而是调用 type.__call__
,EarlyStopping
的(元)类。 type.__call__
是 Python 在初始化对象时执行的第一个操作,它被调用接受传递的任何参数,然后(在其他一些操作之后)调用 __new__
和 __init__
按此顺序;本质上,__init__
是通过参数 patience=100
间接调用的。
关于python - 此类的 __call__ 方法在没有适当参数的情况下被调用时如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40327404/
class Meta(type): def __call__(cls, *args, **kwargs): print 'Meta.__call__ called.'
一个非常简单的类不是可调用类型: >>> class myc: ... pass ... >>> c=myc() >>> callable(c) False 如何判断一个类是否有方法__cal
我想在 python 中实现单例模式,我喜欢 http://www.python-course.eu/python3_metaclasses.php 中描述的模式. class Singleton(t
根据我对 Python 面向对象编程的所有了解,如果一个类定义了 __call__ 方法,如果我们像函数调用一样使用该类的实例,该方法将被调用。例如: class Employee: def
Python 的神奇方法 __call__ 会在您尝试调用对象时被调用。 Cls()() 因此等于 Cls.__call__(Cls())。 函数是 Python 中的第一类对象,这意味着它们只是可调
在 python 中,您可以通过实现 __call__ 方法使实例可调用。例如 class Blah: def __call__(self): print "hello" ob
我需要在测试中修补当前日期时间。我正在使用这个解决方案: def _utcnow(): return datetime.datetime.utcnow() def utcnow():
我知道类中的 __call__ 方法是在调用类的实例时触发的。但是,我不知道什么时候可以使用这种特殊方法,因为可以简单地创建一个新方法并执行在 __call__ 方法中完成的相同操作,而不是调用实例,
本节再介绍 Python 类中一个非常特殊的实例方法,即 __call__()。该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。 举个例子
这个问题在这里已经有了答案: Overriding special methods on an instance (5 个回答) 关闭2年前。 我需要更改给定对象的 __call__ 方法的行为。天真
class Method(object): def __call__(self): #how could I get the App instance here?
我试图理解下面的代码。 class Chain(object): def __init__(self, path=''): self._path = path def
我正在浏览 Daniel Nouri 的 tutorial关于使用 CNN 的面部识别,我遇到了一些我不理解的代码。 Daniel 正在定义一个在网络训练期间每次迭代结束时调用的类,它将决定训练是否应
Python 的可调用对象是具有 __call__ 方法的对象。它们大部分时间是函数,但也可能是类实例。 但是函数确实有一个 __call__ 方法。因此,一个 __call__ 方法也有一个 __c
我正在用 Python 编写单元测试,我想创建一个模拟函数,在调用时返回另一个模拟(由我指定)。 这是我尝试过的: my_mock = Mock() fn = Mock() fn.__call__ =
以此为例: class Foo(object): def __init__(self, msg): self._msg = msg def __call__(self):
考虑以下代码: class MyCustomDescriptor: def __init__(self,foo): self._foo = foo def __call
我正在测试 simpleTAL 模板库,它使用 callable 来测试传入模板的对象是否为函数。 callable 的定义是说如果一个对象包含魔法方法__call__,那么它就是可调用的。另见 Wh
我在 python2.7 中使用 tkinter。我想要做的就是在一个类中绘制一个 Canvas ,然后在另一个类中绘制一个 Canvas ,该类将在 Canvas 周围移动一个正方形。但出于某种原因
我试图在运行时定义 __call__ dunder 方法,但没有成功。代码如下: class Struct: pass result=Struct() dictionary={'a':5,'b
我是一名优秀的程序员,十分优秀!