2016-03-30 20 views
3

Ich versuche, ein extrem einfaches neuronales Netzwerk mit Lasagne zu trainieren: eine dichte Schicht mit einem Ausgang, ohne Nichtlinearität (so ist es einfach eine lineare Regression). Hier ist mein Code:Einfache Lasagne Netzwerk-Ausgang ist sehr langsam

#!/usr/bin/env python 

import numpy as np 
import theano 
import theano.tensor as T 
import lasagne 
import time 

def build_mlp(input_var=None): 
    l_in = lasagne.layers.InputLayer(shape=(None, 36), input_var=input_var) 

    l_out = lasagne.layers.DenseLayer(
     l_in, 
     num_units=1) 

    return l_out 

if __name__ == '__main__': 
    start_time = time.time() 

    input_var = T.matrix('inputs') 
    target_var = T.fvector('targets') 
    network = build_mlp(input_var) 
    prediction = lasagne.layers.get_output(network)[:, 0] 
    loss = lasagne.objectives.aggregate(lasagne.objectives.squared_error(prediction, target_var), mode="sum") 
    params = lasagne.layers.get_all_params(network, trainable=True) 
    updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.01, momentum=0.01) 
    train_fn = theano.function([input_var, target_var], loss, updates=updates, allow_input_downcast=True) 

    features = [-0.7275278, -1.2492378, -1.1284761, -1.5771232, -1.6482532, 0.57888401,\ 
    -0.66000223, 0.89886779, -0.61547941, 1.2937579, -0.74761862, -1.4564357, 1.4365945,\ 
    -3.2745962, 1.3266684, -3.6136472, 1.5396905, -0.60452163, 1.1510054, -1.0534937,\ 
    1.0851847, -0.096269868, 0.15175876, -2.0422907, 1.6125549, -1.0562884, 2.9321988,\ 
    -1.3044566, 2.5821636, -1.2787727, 2.0813208, -0.87762129, 1.493879, -0.60782474, 0.77946049, 0.0] 

    print("Network built in " + str(time.time() - start_time) + " sec") 

    it_number = 1000 

    start_time = time.time() 
    for i in xrange(it_number): 
     val = lasagne.layers.get_output(network, features).eval()[0][0] 
    print("1K outputs: " + str(time.time() - start_time) + " sec") 

    p = params[0].eval() 

    start_time = time.time() 
    for i in xrange(it_number): 
     n = np.dot(features, p) 
    print("1K dot products: " + str(time.time() - start_time) + " sec") 

    print(val) 
    print(n) 

Ich bin kein Netzwerk trainiert hier noch, nur 1K evals tun (mit anfänglichen Zufallsgewichten), um zu sehen, wie viel Zeit es 1K tatsächlichen Prognosen von meinem Netzwerk bekommen nehmen. Im Vergleich zu 1K-Dot-Produkten ist es eine schreckliche Verlangsamung!

Also meine Frage ist: Warum braucht es so viel Zeit, um solche einfachen Netzwerk zu bewerten?

Auch ich bin verwirrt über den vorhergesagten Wert. Wenn das Punktprodukt weniger als Null ist, die Netzwerk-Ausgänge 0, sonst werden diese beiden Werte gleichen die:

Network built in 8.96299982071 sec 
1K outputs: 54.2732210159 sec 
1K dot products: 0.00287079811096 sec 
1.10120121082 
[ 1.10120121] 

Fehle ich etwas darüber, wie DenseLayer funktioniert?

Antwort

2

Dank Jan Schlueter auf https://groups.google.com/forum/#!forum/lasagne-users gibt es eine Antwort darauf.

Hier habe ich nicht nur 1K Durchgänge durch das Netzwerk gemacht, sondern kompilierte 1K verschiedene Funktionen und rufe sie jeweils einmal an. Anstatt eval() auf 1K verschiedene Ausdrücke zu verwenden (sie sind unterschiedlich, weil sie jeweils ein anderes numpy Array als Konstante enthalten), hätte ich eine einzige Vorhersagefunktion kompiliert (ähnlich wie train_fn, aber die Vorhersage zurücksendend, anstatt den Verlust und Updates durchführen) und dieses 1K mal in einer Schleife aufrufen.

Frage zum DenseLayer auch gelöst:

Die DenseLayer enthält eine Nicht-Linearität, die standardmäßig auf den Gleichrichter. Der Gleichrichter setzt alle Ausgänge kleiner als Null auf Null.

Es scheint, dass alle Lasagne Fragen eher auf googlegroups als auf StackOverflow beantwortet werden. Laut Jan konzentrieren sie sich mehr auf die Mailingliste.

+0

Können Sie den aktualisierten Code zum Kompilieren der einzelnen Vorhersagefunktion posten? Ich versuche das Gleiche zu tun. – nick

+0

val_fn = theano.function ([input_var], Vorhersage) –

+0

Wow. Das war einfach. Vielen Dank! – nick