2016-05-31 5 views
0

Ich habe versucht, Scan in Theano zu verwenden, um eine RNN für die Umsetzung (das Beispiel von hier angepasst: https://github.com/valentin012/conspeech/blob/master/rnn_theano.py)Scan-Funktion in Theano, rekurrenten neuronalen Netz

def forward_prop_step(x_t, s_t_prev, U, V, W): 
    u = T.dot(x_t,U) 
    s_t = T.tanh(u+T.dot(s_t_prev,W)) 
    o_t = T.nnet.softmax(T.dot(s_t,V)) 
    return [o_t[0], s_t] 
Q = np.zeros(self.hidden_dim) 
init = theano.shared(Q) 
[o,s], updates = theano.scan(
    forward_prop_step, 
    sequences=x, 
    outputs_info=[None, dict(initial=init)], 
    non_sequences=[U, V, W], 
    truncate_gradient=self.bptt_truncate, 
    strict=False) 

Nun, was habe ich versucht zu tun ist, implementieren Sie einen RNN, bei dem sich die Ausgangsvariablen gegenseitig beeinflussen (o_{t-1} und o_t sind durch Gewichte verbunden). Ich habe versucht, es so zu implementieren:

def forward_prop_step(x_t, s_t_prev, o_t_prev, U, V, W, Q): 
    u = T.dot(x_t,U) 
    s_t = T.tanh(u+T.dot(s_t_prev,W)) 
    o_t = T.nnet.softmax(T.dot(o_t_prev,Q)+T.dot(s_t,V)) 
    return [o_t[0], s_t, o_t[0]] 
R = np.zeros(self.hidden_dim) 
init = theano.shared(R) 
S = np.zeros(self.word_dim) 
init_S = theano.shared(S) 
[o,s,op], updates = theano.scan(
    forward_prop_step, 
    sequences=x, 
    outputs_info=[None, dict(initial=init), dict(initial=init_S)], 
    non_sequences=[U, V, W, Q], 
    truncate_gradient=self.bptt_truncate, 
    strict=False) 

Allerdings funktioniert es nicht, und ich weiß nicht, wie es zu beheben.

Die Fehlermeldung lautet:

File "theano/scan_module/scan_perform.pyx", line 397, in theano.scan_module.scan_perform.perform (/home/mertens/.theano/compiledir_Linux-3.2--amd64-x86_64-with-debian-7.6--2.7.9-64/scan_perform/mod.cpp:4193) ValueError: Shape mismatch: A.shape[1] != x.shape[0] Apply node that caused the error: CGemv{inplace}(AllocEmpty{dtype='float64'}.0, TensorConstant{1.0}, Q_copy.T, , TensorConstant{0.0}) Toposort index: 10

bearbeiten Dies ist der genaue Code ist:

word_dim=3 
hidden_dim=4 

U = np.random.uniform(-np.sqrt(1./word_dim), np.sqrt(1./word_dim), (word_dim,hidden_dim)) 
V = np.random.uniform(-np.sqrt(1./hidden_dim), np.sqrt(1./hidden_dim), (hidden_dim,word_dim)) 
W = np.random.uniform(-np.sqrt(1./hidden_dim), np.sqrt(1./hidden_dim), (hidden_dim, hidden_dim)) 
Q = np.random.uniform(-np.sqrt(1./word_dim), np.sqrt(1./word_dim), (word_dim, word_dim)) 

U = theano.shared(name='U', value=U.astype(theano.config.floatX)) 
V = theano.shared(name='V', value=V.astype(theano.config.floatX)) 
W = theano.shared(name='W', value=W.astype(theano.config.floatX)) 
Q = theano.shared(name='Q', value=W.astype(theano.config.floatX)) 

def forward_prop_step(x_t, o_t_prev, s_t_prev, U, V, W, Q): 
     u = T.dot(x_t,U) 
     s_t = T.tanh(u+T.dot(s_t_prev,W)) 
     m = T.dot(o_t_prev,Q) 
     mm = T.dot(s_t,V) 
     SSS = mm 
     o_t = T.nnet.softmax(SSS) 
     q_t = o_t[0] 
     return [q_t, s_t, m] 

R = np.zeros(self.hidden_dim) 
init = theano.shared(R) 
S = np.zeros(self.word_dim) 
init_S = theano.shared(S) 
[o,s,loorky], updates = theano.scan(
     forward_prop_step, 
     sequences=x, 
     outputs_info=[dict(initial=init_S),dict(initial=init),None], 
     non_sequences=[U, V, W, Q], 
     truncate_gradient=self.bptt_truncate, 
     strict=False) 

self.my_forward_propagation = theano.function([x], [o,s,loorky]) 
aaa = np.zeros((1,3))+1 
print self.my_forward_propagation(aaa) 

Wenn ich die Ausgabe m von der return-Anweisung (und entsprechend die loorky Variable Plus auslassen die letzte None in outputs_info) ist alles in Ordnung. Wenn dies enthalten ist, erhalte ich die Fehlermeldung ValueError: Form nicht übereinstimmen: A.shape [1]! = X.shape [0]

Antwort

0

Form der Implementierung ist nicht klar zu sagen, was in Ihrem Code falsch ist. Könnten Sie die Leitung überprüfen hier

o_t = T.nnet.softmax(T.dot(o_t_prev,Q)+T.dot(s_t,V)) 

was Q Dimension ist, und wenn es anwendbar ist

+0

Das Problem zu s_t hinzugefügt werden soll, mehr denke ich, wie das zusätzliche Argument von o_t_prev passieren (wie das zu tun mit outputs_info, etc.) Ich verstehe die Scan-Funktion wirklich nicht. – user329469

+0

output_info zum Übergeben von Anfangswerten, die als vorherige Eingabe in der Scan-Funktion verwendet werden sollen. So können Sie es sehen. der Fehler in Ihrem Code über 'Form nicht übereinstimmen: A.shape [1]! = x.shape [0]' – Feras

+0

Vielen Dank für Ihre Bemühungen, Mann. Das Problem war: Ersetzen Sie 'Q = theano.shared (Name = 'Q', Wert = W.astype (theano.config.floatX))' durch 'Q = theano.shared (Name = 'Q', Wert = Q .astype (theano.config.floatX)) ' – user329469