1

Ich versuche verschiedene Aktivierungsfunktionen in meinem einfachen neuronalen Netzwerk.Wie benutzt man tf.nn.crelu im Tensorflow?

Es spielt keine Rolle mit tf.nn.relu, tf.nn.sigmoid, ... das Netzwerk tut, was es tun soll.

Aber wenn ich tf.nn.crelu verwende, habe ich einen Dimensionsfehler.

Es gibt so etwas wie [max, min] und die Breite Dimension ist doppelt so groß. Was muss ich tun? Die folgenden Gewichte und Vorspannungen an den Ausgang von crelu anpassen?

+0

CReLu Verkettet eine ReLU, die nur den positiven Teil der Aktivierung mit einer ReLU auswählt, die nur den negativen Teil der Aktivierung auswählt. Beachten Sie, dass diese Nichtlinearität folglich die Tiefe der Aktivierungen verdoppelt. Sie können hier mehr lesen. https://www.tensorflow.org/api_docs/python/tf/nn/crel –

+0

ja, das ist es was es tut. aber wie benutzt man es? – j35t3r

+0

Können Sie den folgenden Link überprüfen, enthält es eine Beispielimplementierung (verwendet Crelu von Chainer, aber es ist sehr ähnlich/das gleiche wie Tensorflow) https://programtalk.com/vs2/python/10099/chainer/tests/chainer_tests/functions_tests/ Aktivierungstests/test_crelu.py / –

Antwort

1

Sie haben recht, wenn Sie das Netzwerk manuell erstellen, müssen Sie die Abmessungen der folgenden Ebene anpassen, damit sie mit der Ausgabe tf.nn.crelu übereinstimmt. In diesem Sinne ist tf.nn.crelunicht austauschbar mit tf.nn.relu, tf.nn.elu usw.

Die Situation ist einfacher, wenn Sie einen High-Level-API verwenden, z.B. tensorflow slim. In diesem Fall sorgen die Layer-Funktionen für übereinstimmende Abmessungen, so dass Sie einfach tf.nn.relu durch tf.nn.crelu in Code ersetzen können. Bedenken Sie jedoch, dass das Netzwerk lautlos doppelt so groß wird.

Hier ist ein Beispiel:

with slim.arg_scope([slim.conv2d, slim.fully_connected], 
        activation_fn=tf.nn.crelu, 
        normalizer_fn=slim.batch_norm, 
        normalizer_params={'is_training': is_training, 'decay': 0.95}): 
    conv1 = slim.conv2d(x_image, 16, [5, 5], scope='conv1') 
    pool1 = slim.max_pool2d(conv1, [2, 2], scope='pool1') 
    conv2 = slim.conv2d(pool1, 32, [5, 5], scope='conv2') 
    pool2 = slim.max_pool2d(conv2, [2, 2], scope='pool2') 
    flatten = slim.flatten(pool2) 
    fc = slim.fully_connected(flatten, 1024, scope='fc1') 
    drop = slim.dropout(fc, keep_prob=keep_prob) 
    logits = slim.fully_connected(drop, 10, activation_fn=None, scope='logits') 

slim.arg_scope gilt einfach alle vorgesehenen Argumente zu den darunter liegenden Schichten, insbesondere activation_fn. Beachten Sie auch activation_fn=None in der letzten Schicht, um die Ausgabedimension zu fixieren. Kompletter Code kann found here sein.