ダニエル・ノウリのtutorialさんにCNNを使った顔認識についてお伝えしていますが、わかりません。これはある意味、中しかし、実際の実装を行いこのクラスの__call__メソッドは、適切な引数なしで呼び出されるとどのように動作しますか?
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
をどのように関数に渡されることなく使用するのかについて混乱しています。
これで、初期化されたオブジェクトは、適切な引数を付けてNeuralNetのソースコードのどこかで呼び出されます。この機能を実装するのは奇妙な方法のようです。なぜ関数を渡すだけではないのですか? –