Python 这门课怎么样;s u调用u方法工作,当它';没有适当的论据就叫作什么?
我正在浏览Daniel Nouri关于使用CNN的面部识别的文章,我遇到了一些我不懂的代码。Daniel正在定义一个类,该类将在网络培训期间的每次迭代结束时调用,该类将决定培训是否应提前停止:Python 这门课怎么样;s u调用u方法工作,当它';没有适当的论据就叫作什么?,python,python-2.7,class,python-3.x,nolearn,Python,Python 2.7,Class,Python 3.x,Nolearn,我正在浏览Daniel Nouri关于使用CNN的面部识别的文章,我遇到了一些我不懂的代码。Daniel正在定义一个类,该类将在网络培训期间的每次迭代结束时调用,该类将决定培训是否应提前停止: class EarlyStopping(object): def __init__(self, patience=100): self.patience = patience self.best_valid = np.inf self.best_va
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()
显然,Daniel将类作为函数调用。但是,如果没有
\uuuu call\uuu(args)
中显示的参数,我不理解他是如何调用它的。nolearn的源代码就是这样实现的吗?我很困惑,网络是如何知道在没有传递到函数的情况下使用nn
和train\u历史记录的。他没有调用\u call_u
并没有调用earlystup(耐心=200)
,而是调用*earlystup.\u init\uu
签名:
def __init__(self, patience=100):
并为
耐心提供替代值;这与\uuuu init\uuuu
的可用参数完全匹配
earlystoping.\uuuu call\uuuu
在实例上被调用;也就是说,如果调用顺序为:
e = EarlyStopping(patience = 200)
e(patience=50) # TypeError Raised
将出现一个适当的错误
*让你感到困惑的括号实际上是在打电话。调用的不是
earlystoping.\uuuu-call\uuuu
,而是type.\uuuuu-call\uuuu
,即earlystoping
的(元)类<代码>类型。调用是Python在初始化对象时执行的第一个操作,它被调用时接受传递的任何参数,然后(在一些其他操作之后)按该顺序调用\uuuuuuuu new\uuuuu
和\uuuu init\uuuuu
;本质上,\uuuuuu init\uuuuu
是通过patience=100
的参数间接调用的,那么我是否应该假设初始化对象随后在NeuralNet的源代码中的某个地方被调用,并带有适当的参数?在我看来,实现这一功能似乎是一种奇怪的方式。为什么不直接传递一个函数呢?
e = EarlyStopping(patience = 200)
e(patience=50) # TypeError Raised