2017-09-18 5 views
2

Ich bin neu in MXNet (ich benutze es in Python3)MXNet: nn.Activation vs nd.relu?

Ihre Tutorial-Serie ermutigt Sie, Ihre eigenen gluon blocks zu definieren.

kann also sagen, dass dies Ihr Block ist (eine gemeinsame Faltungsstruktur):

class CNN1D(mx.gluon.Block): 
    def __init__(self, **kwargs): 
     super(CNN1D, self).__init__(**kwargs) 
     with self.name_scope(): 
      self.cnn = mx.gluon.nn.Conv1D(10, 1) 
      self.bn = mx.gluon.nn.BatchNorm() 
      self.ramp = mx.gluon.nn.Activation(activation='relu') 

    def forward(self, x): 
     x = mx.nd.relu(self.cnn(x)) 
     x = mx.nd.relu(self.bn(x)) 
     x = mx.nd.relu(self.ramp(x)) 
     return x 

Dies ist die Struktur ihres Beispiels spiegeln. Was ist der Unterschied zwischen mx.nd.relu vs mx.gluon.nn.Activation?

Sollte es

x = self.ramp(x) 

statt vom NDArray Modul zum Aufruf eines Host der zugrunde liegenden Aktivierungen

x = mx.nd.relu(self.ramp(x)) 

Antwort

2

Es scheint, dass

mx.gluon.nn.Activation(activation=<act>) 

ist ein Wrapper sein.

So - im Prinzip - es ist egal, ob in der Vorwärts Definition verwendet man

x = self.ramp(x) 

oder

x = mx.nd.relu(x) 

oder

x = mx.nd.relu(self.ramp(x)) 

als relu einfach ist die maximale Einnahme von 0 und dem übergebenen Wert (also beeinflussen mehrere Anwendungen den Wert nicht mehr als ein einzelner Aufruf nebenher m eine leichte Laufzeitverlängerung).

Also in dieser Fall ist es nicht wirklich wichtig. Bei anderen Aktivierungsfunktionen könnte das Stapeln mehrerer Aufrufe natürlich Auswirkungen haben.

In der MXNets-Dokumentation verwenden sie nd.relu in der Forward-Definition bei der Definition gluon.Block s. Dies könnte etwas weniger Overhead als die Verwendung mx.gluon.nn.Activation(activation='relu') tragen.

Flavour-weise ist das gluon Modul die Abstraktion auf hohem Niveau. Daher bin ich der Meinung, dass bei der Definition eines Blocks ramp = mx.gluon.nn.Activation(activation=<act>) anstelle von nd.<act>(x) verwendet werden sollte und dann self.ramp(x) in der Forward-Definition aufgerufen werden sollte.

Allerdings, dass an diesem Punkt alle benutzerdefinierten Block Tutorials/Dokumentation zu relu Aktivierung bleiben, ob dies dauerhafte Auswirkungen haben wird, ist noch nicht gesehen.

Insgesamt scheint die Verwendung von mx.gluon.nn.Activation eine Möglichkeit zu sein, Aktivierungsfunktionen vom Modul NDArray aus dem Gluon Modul aufzurufen.

+0

Eine separate Antwort hinzugefügt, um klarer zu sein. –

1

mx.gluon.nn.Activation wraps um mx.ndarray.Activation, siehe Gluon source code.

Wenn Sie Gluon jedoch zum Aufbau eines neuronalen Netzes verwenden, sollten Sie die Gluon-API verwenden und nicht verzweigen, um die untere Ebene der MXNet-API beliebig zu verwenden. Dies kann zu Problemen führen, wenn Gluon weiterentwickelt und möglicherweise geändert wird mit mx.nd unter der Haube).