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.
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.
Vielen Dank, das ist, was ich gesucht habe. – jbssm
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
@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 –