2016-06-24 13 views
6

Stavo tentando di creare una rete neurale che utilizza l'apprendimento di rinforzo. Ho scelto scikit-neuralnetwork come libreria (perché è semplice). Sembra, però, che il montaggio due volte fa crollare Theano.sknn - mancata corrispondenza delle dimensioni di input sul secondo adattamento

Ecco il codice più semplice che provoca l'arresto (Nota, non importa ciò che gli strati non ci sono, né il tasso di apprendimento o n_iter):

import numpy as np 
from sknn.mlp import Classifier, Layer 

clf = Classifier(
    layers=[ 
     Layer("Softmax") 
     ], 
    learning_rate=0.001, 
    n_iter=1) 

clf.fit(np.array([[0.]]), np.array([[0.]])) # Initialize the network for learning 

X = np.array([[-1.], [1.]]) 
Y = np.array([[1.], [0.]]) 

clf.fit(X, Y) # crash 

Ed ecco l'errore che ho ottenuto:

ValueError: Input dimension mis-match. (input[0].shape[1] = 2, input[1].shape[1] = 1) 
Apply node that caused the error: Elemwise{Mul}[(0, 1)](y, LogSoftmax.0) 
Toposort index: 12 
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)] 
Inputs shapes: [(1L, 2L), (1L, 1L)] 
Inputs strides: [(16L, 8L), (8L, 8L)] 
Inputs values: [array([[ 1., 0.]]), array([[ 0.]])] 
Outputs clients: [[Sum{axis=[1], acc_dtype=float64}(Elemwise{Mul}[(0, 1)].0)]] 

testato in Python 2.7.11

Ha sknn non supporta il montaggio più volte, o sto facendo qualche idiota sbaglio? In caso contrario, come si dovrebbe implementare l'apprendimento di rinforzo?

risposta

1

Io non uso sknn molto spesso tuttavia è molto simile a sklearn quindi potrei essere in grado di aiutare!

Prima di tutto quando si utilizza il metodo fit si reinizializzeranno i pesi, se si desidera aggiornare i pesi in base ai nuovi dati è necessario utilizzare il metodo partial_fit.

Per quanto riguarda l'arresto, è perché l'array X ha una forma diversa nella prima dimensione anziché nella seconda.

import numpy as np 
from sknn.mlp import Classifier, Layer 

clf = Classifier(
    layers=[ 
     Layer("Softmax") 
     ], 
    learning_rate=0.001, 
    n_iter=1) 

# Original training data 
X = np.array([[0.]]) 
Y = np.array([[0.]]) 
print X.shape, Y.shape 

# Data used for second fitting 
X = np.array([[-1.], [1.]]) 
Y = np.array([[1.], [0.]]) 
print X.shape, Y.shape 


# Use the partial fit method to update weights 
clf.partial_fit(X, Y) # Initialize the network for learning 
clf.partial_fit(X, Y) # Update the weights 


# Multiple training examples by stacking two on top of each other 
X = np.concatenate((X, X)) 
Y = np.concatenate((Y, Y)) 
print X.shape, Y.shape 

clf.partial_fit(X, Y) 

Uscite:

(1, 1) (1, 1) 
(2, 1) (2, 1) 
(4, 1) (4, 1) 
+0

sknn non ha partial_fit (cercato di trovare molto prima questa domanda). Altrimenti, non sono riuscito a far funzionare le reti neurali di sklearn. – seequ

+0

Quali versioni stai utilizzando perché quel codice funziona correttamente? – ncfirth

+1

Puoi vedere il metodo 'partial_fit' nei sknn docs http://scikit-neuralnetwork.readthedocs.io/en/latest/module_mlp.html#classifier – ncfirth