2015-08-22 3 views
5

Ich mache ein neurales Netzwerk in Nolearn, eine Theano basierte Bibliothek, die Lasagne verwendet.Wie definiert man eine Kostenfunktion in Nolearn, Lasagne?

Ich verstehe nicht, wie ich meine eigene Kostenfunktion definieren.

Die Ausgangsschicht ist nur 3 Neuronen [0, 1, 2] und ich mag es meist um sicher zu sein, wenn es 1 oder 2 gibt, aber ansonsten - wenn es nicht wirklich sicher, von 1, 2 ist - einfach 0.

zurück zu geben,

Also, ich kam mit einer Kostenfunktion (wird tuning tun müssen), wo die Kosten doppelt für 1 und 2 als für 0, aber ich kann nicht verstehen, wie dies dem Netzwerk zu sagen.

# optimization method: 
from lasagne.updates import sgd 
update=sgd, 
update_learning_rate=0.0001 

Dies ist der Code für das Update, aber wie ich SGD sagen, meine Kostenfunktion zu verwenden, anstatt sie besitzen wird?

EDIT: Der vollständige Netzcode:

def nn_loss(data, x_period, columns, num_epochs, batchsize, l_rate=0.02): 
    net1 = NeuralNet(
     layers=[('input', layers.InputLayer), 
       ('hidden1', layers.DenseLayer), 
       ('output', layers.DenseLayer), 
       ], 
     # layer parameters: 
     batch_iterator_train=BatchIterator(batchsize), 
     batch_iterator_test=BatchIterator(batchsize), 

     input_shape=(None, int(x_period*columns)), 
     hidden1_nonlinearity=lasagne.nonlinearities.rectify, 
     hidden1_num_units=100, # number of units in 'hidden' layer 
     output_nonlinearity=lasagne.nonlinearities.sigmoid, 
     output_num_units=3, 

     # optimization method: 
     update=nesterov_momentum, 
     update_learning_rate=5*10**(-3), 
     update_momentum=0.9, 
     on_epoch_finished=[ 
      EarlyStopping(patience=20), 
     ], 
     max_epochs=num_epochs, 
     verbose=1, 

     # Here are the important parameters for multi labels 
     regression=True, 
     # objective_loss_function=multilabel_objective, 
     # custom_score=("validation score", lambda x, y: np.mean(np.abs(x - y))) 
     ) 

    # Train the network 
    start_time = time.time() 
    net1.fit(data['X_train'], data['y_train']) 
} 

EDIT Fehler bei der Verwendung von regression=True

Got 99960 testing datasets. 
# Neural Network with 18403 learnable parameters 

## Layer information 

    # name  size 
--- ------- ------ 
    0 input  180 
    1 hidden1  100 
    2 output  3 

Traceback (most recent call last): 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/theano/compile/function_module.py", line 607, in __call__ 
    outputs = self.fn() 
ValueError: GpuElemwise. Input dimension mis-match. Input 1 (indices start at 0) has shape[1] == 1, but the output's size on that axis is 3. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "train_nolearn_simple.py", line 272, in <module> 
    main(**kwargs) 
    File "train_nolearn_simple.py", line 239, in main 
    nn_loss_fit = nn_loss(data, x_period, columns, num_epochs, batchsize) 
    File "train_nolearn_simple.py", line 217, in nn_loss 
    net1.fit(data['X_train'], data['y_train']) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/nolearn/lasagne/base.py", line 416, in fit 
    self.train_loop(X, y) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/nolearn/lasagne/base.py", line 462, in train_loop 
    self.train_iter_, Xb, yb) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/nolearn/lasagne/base.py", line 516, in apply_batch_func 
    return func(Xb) if yb is None else func(Xb, yb) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/theano/compile/function_module.py", line 618, in __call__ 
    storage_map=self.fn.storage_map) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/theano/gof/link.py", line 297, in raise_with_op 
    reraise(exc_type, exc_value, exc_trace) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/six.py", line 658, in reraise 
    raise value.with_traceback(tb) 
    File "/Users/morgado/anaconda/lib/python3.4/site-packages/theano/compile/function_module.py", line 607, in __call__ 
    outputs = self.fn() 
ValueError: GpuElemwise. Input dimension mis-match. Input 1 (indices start at 0) has shape[1] == 1, but the output's size on that axis is 3. 
Apply node that caused the error: GpuElemwise{Sub}[(0, 1)](GpuElemwise{Composite{scalar_sigmoid((i0 + i1))}}[(0, 0)].0, GpuFromHost.0) 
Toposort index: 22 
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)] 
Inputs shapes: [(200, 3), (200, 1)] 
Inputs strides: [(3, 1), (1, 0)] 
Inputs values: ['not shown', 'not shown'] 
Outputs clients: [[GpuCAReduce{pre=sqr,red=add}{1,1}(GpuElemwise{Sub}[(0, 1)].0), GpuElemwise{Mul}[(0, 0)](GpuElemwise{Sub}[(0, 1)].0, GpuElemwise{Composite{scalar_sigmoid((i0 + i1))}}[(0, 0)].0, GpuElemwise{sub,no_inplace}.0), GpuElemwise{mul,no_inplace}(CudaNdarrayConstant{[[ 2.]]}, GpuElemwise{Composite{(inv(i0)/i1)},no_inplace}.0, GpuElemwise{Sub}[(0, 1)].0, GpuElemwise{Composite{scalar_sigmoid((i0 + i1))}}[(0, 0)].0, GpuElemwise{sub,no_inplace}.0)]] 

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'. 
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node. 

Antwort

2

Siehe das folgende Beispiel (aus here), der seine eigenen spezifiziert Verlustfunktion:

import lasagne 
import theano.tensor as T 
import theano 
from lasagne.nonlinearities import softmax 
from lasagne.layers import InputLayer, DenseLayer, get_output 
from lasagne.updates import sgd, apply_momentum 
l_in = InputLayer((100, 20)) 
l1 = DenseLayer(l_in, num_units=3, nonlinearity=softmax) 
x = T.matrix('x') # shp: num_batch x num_features 
y = T.ivector('y') # shp: num_batch 
l_out = get_output(l1, x) 
params = lasagne.layers.get_all_params(l1) 
loss = T.mean(T.nnet.categorical_crossentropy(l_out, y)) 
updates_sgd = sgd(loss, params, learning_rate=0.0001) 
updates = apply_momentum(updates_sgd, params, momentum=0.9) 
train_function = theano.function([x, y], updates=updates) 

Zufälligerweise hat dieser Code auch drei Einheiten in der Ausgabeschicht.

6

Wenn Sie Ihr neuronales Netzwerk instanziiert, Sie eine benutzerdefinierte Verlustfunktion passieren können, die Sie vorher definiert haben:

import theano.tensor as T 
import numpy as np 
from nolearn.lasagne import NeuralNet 
# I'm skipping other inputs for the sake of concision 

def multilabel_objective(predictions, targets): 
    epsilon = np.float32(1.0e-6) 
    one = np.float32(1.0) 
    pred = T.clip(predictions, epsilon, one - epsilon) 
    return -T.sum(targets * T.log(pred) + (one - targets) * T.log(one - pred), axis=1) 

net = NeuralNet(
    # your other parameters here (layers, update, max_epochs...) 
    # here are the one you're interested in: 
    objective_loss_function=multilabel_objective, 
    custom_score=("validation score", lambda x, y: np.mean(np.abs(x - y))) 
    ) 

Wie Sie sehen können, ist es auch möglich, eine individuelle Punktzahl (mit dem Schlüsselwort custom_score definieren)

+0

Vielen Dank, das ist, was ich gesucht habe. – jbssm

+0

Nach der Implementierung gibt es ein Problem mit der neuen Verlustfunktion, die nur eine Batchgröße von 2 akzeptiert. Ich habe die Frage mit dem Code aktualisiert. – jbssm

+0

@jbssm Das funktioniert gut mit Batch-Größe von 128 in meinem Code, können Sie die Fehlermeldung in Ihre Frage aufnehmen? Bitte beachten Sie auch X_train.shape und y_train.shape –

1

Ich verwendete eine benutzerdefinierte Verlustfunktion in einer Klassifizierungsaufgabe und dachte, dass ich das auch mit Ihnen teilen würde. Grundsätzlich wollte ich die Trainingsdaten je nach Label unterschiedlich betonen.

import lasagne 
import theano.tensor as T 
import theano 

def weighted_crossentropy(predictions, targets): 

    weights_per_label = theano.shared(lasagne.utils.floatX([0.2, 0.4, 0.4])) 
    weights = weights_per_label[targets] #returns a targets-shaped weight matrix 
    loss = lasagne.objectives.aggregate(T.nnet.categorical_crossentropy(predictions, targets), weights=weights) 
    return loss 

net = NeuralNet(
    # layers and parameters 
    objective_loss_function=weighted_crossentropy, 
    # ... 
    ) 

This ist, wo ich gefunden habe, wie man es implementiert.

+0

http://stackoverflow.com/questions/39412051/how-to-penalize-predictions-binary-cross-entropy-and-conv-nets, Danke. Ich denke, das wird mir helfen, es zu lösen. – KenobiShan

Verwandte Themen