[PYTHON] Lassen Sie uns die Berichtsfunktion von Chainer zusammenfassen

tl;dr

Sie können die Mindestprotokollierung kostenlos erhalten, indem Sie "Trainer.extend (extensions.LogReport ())" schreiben. Sie können glücklich sein, wenn Sie "extensions.ParameterStatistics" behalten.

Zweck

Es ist ein Jahr her, seit die Training Loop Abstraction im Juni 2016 in Version 1.11 in Chainer eingeführt wurde. Ich denke, es gibt viele Leute, die das Vermögen (Schulden?) Der Oreore-Lernschleife nutzen wollen und es nicht berührt haben. Da ich Trainer und andere Dinge schlampig beherrschen möchte, habe ich die Berichterstattung über Lernmetriken zusammengefasst, die nicht so beliebt (aber sehr wichtig) sind.

Verstehen Sie den Berichtsmechanismus in Chainer

Es ist sehr wichtig, verschiedene Metriken für tiefes Lernen zu überwachen. Beispielsweise verfügt Tensorflow über eine leistungsstarke Berichtsfunktion namens Zusammenfassung.

Offiziell gibt es eine Klasse namens "Reporter", die zu berichten scheint: Dokumentation, aber Offiziell Wenn Sie sich das Beispiel ansehen, erscheint die Klasse "Reporter" nirgendwo und die Genauigkeit usw. ist klar angegeben. Es gibt keinen Platz, um es aufzuschreiben. Was bedeutet das?

Wenn Sie sich Offizielles Beispiel L96-97 ansehen, sehen Sie LogReport und` Ich füge dem "Trainer" -Objekt "Erweiterungen" wie PrintReport "hinzu.

# Write a log of evaluation statistics for each epoch
trainer.extend(extensions.LogReport())

Und schauen Sie sich [chainer / chainer / training / manager.py: L291-L299] an (https://github.com/chainer/chainer/blob/v2.0.0/chainer/training/trainer.py#L288-L299) Wenn wir es betrachten, deklarieren wir "mit reporter.scope (self.observation)" am Anfang der Lernschleife. Diese Deklaration stellt sicher, dass alle in der Lernschleife getätigten Aufrufe von "chainer.reporter.report ({'name': value_to_report})" in "self.observation" gespeichert werden.

    def run(self):
        ....
        reporter = self.reporter
        stop_trigger = self.stop_trigger

        # main training loop
        try:
            while not stop_trigger(self):
                self.observation = {}
                with reporter.scope(self.observation):
                    update()
                    for name, entry in extensions:
                        if entry.trigger(self):
                             entry.extension(self)

Mit anderen Worten, selbst wenn Sie nicht explizit "Reporter" sagen, werden die Metriken tatsächlich hinter den Kulissen gesammelt. In Bezug auf die gesammelten Daten rufen Sie nun "entry.extension (self)" auf, chainer / chainer / training / extensions / log_report.py: L67-L88. Es wird an blob / v2.0.0 / chainer / training / extensions / log_report.py # L67-L88 übergeben.

    def __call__(self, trainer):
        # accumulate the observations
        keys = self._keys
        observation = trainer.observation
        summary = self._summary

        if keys is None:
            summary.add(observation)
        else:
            summary.add({k: observation[k] for k in keys if k in observation})

        if self._trigger(trainer):
            # output the result
            stats = self._summary.compute_mean()
            stats_cpu = {}
            for name, value in six.iteritems(stats):
                stats_cpu[name] = float(value)  # copy to CPU

            updater = trainer.updater
            stats_cpu['epoch'] = updater.epoch
            stats_cpu['iteration'] = updater.iteration
            stats_cpu['elapsed_time'] = trainer.elapsed_time

Die Anzahl der Epochen usw. wird in dieser Funktion hinzugefügt und an der entsprechenden Stelle ausgegeben. Wenn keine Erweiterung mit einer Berichtsfunktion registriert ist, werden die Daten einfach verworfen.

Jetzt verstehe ich, warum ich "Reporter" im offiziellen Beispiel nicht explizit gelesen habe. Aber warum ist die Genauigkeit ("Genauigkeit") und der Verlust ("Verlust"), obwohl ich noch nie "chainer.reporter.report" genannt habe?

Schauen Sie sich also [chainer / chainer / links / model / classifier.py] an (https://github.com/chainer/chainer/blob/v2.0.0/chainer/links/model/classifier.py#L71-L75). Wenn Sie schauen, können Sie sehen, dass "chainer.reporter.report" in der offiziellen Implementierung aufgerufen wird.

        self.loss = self.lossfun(self.y, t)
        reporter.report({'loss': self.loss}, self)
        if self.compute_accuracy:
            self.accuracy = self.accfun(self.y, t)
            reporter.report({'accuracy': self.accuracy}, self)

Mit anderen Worten, wenn Sie nur "manager.extend (extensions.LogReport ())" schreiben, erhalten Sie die minimal erforderliche Protokollierung, und wenn Sie in Ihrem Modell nur "chainer.reporter.report" aufrufen, können Sie alle Berichte erstellen. Du kannst es schaffen. Praktisch.

Übrigens, wenn Sie das obige Beispiel ausführen, erhalten Sie die folgende Berichterstattung in "Ergebnis / Protokoll".

[{u'elapsed_time': 6.940603971481323,
  u'epoch': 1,
  u'iteration': 600,
  u'main/accuracy': 0.9213500021273892,
  u'main/loss': 0.2787705701092879,
  u'validation/main/accuracy': 0.9598000049591064,
  u'validation/main/loss': 0.13582063710317016},
 {u'elapsed_time': 14.360282897949219,
  u'epoch': 2,
  u'iteration': 1200,
  ...

Versuchen Sie, den Berichtsinhalt zu erhöhen

Dies ist praktisch genug, aber die Verwendung von "extensions.ParameterStatistics" ist reichhaltig wie Tensorflows tf.summary.histogram. Überwachung ist möglich.

...
trainer.extend(extensions.ParameterStatistics(model))
...

Der repräsentative Wert jeder im Modell enthaltenen Link-Matrix wird automatisch erfasst und zum Ergebnis hinzugefügt. Es ist sehr praktisch.

[{u'None/predictor/l1/W/data/max': 0.18769985591371854,
  u'None/predictor/l1/W/data/mean': 0.0006860141372822189,
  u'None/predictor/l1/W/data/min': -0.21658104345202445,
  u'None/predictor/l1/W/data/percentile/0': -0.1320047355272498,
  u'None/predictor/l1/W/data/percentile/1': -0.08497818301255008,
  u'None/predictor/l1/W/data/percentile/2': -0.04122352957670082,
  u'None/predictor/l1/W/data/percentile/3': 0.0008963784146650747,
  u'None/predictor/l1/W/data/percentile/4': 0.0428067545834066,
  ...

Das obige Ausführungsergebnis befindet sich in gist.

Recommended Posts

Lassen Sie uns die Berichtsfunktion von Chainer zusammenfassen
Fassen wir Apache zusammen
Versuchen Sie, eine logistische Funktion zu zeichnen
Lassen Sie uns kurz LPIC Level 1 (102) zusammenfassen.
Lassen Sie uns kurz LPIC Level 1 (101 Ausgaben) zusammenfassen.