2017-05-08 4 views
0

Ich versuche, das MATCH LSTM aus diesem Papier zu implementieren: https://arxiv.org/pdf/1608.07905.pdfeinen Grund LSTM Zelle innerhalb einer Zelle Tensorflow benutzerdefinierten Aufruf

Ich verwende Tensorflow. Ein Teil der Architektur ist eine RNN, die die Eingabe und den vorherigen Zustand verwendet, um einen Aufmerksamkeitsvektor zu berechnen, der auf einen Kontext angewendet wird, bevor das Ergebnis mit den Eingaben verkettet und in ein LSTM gesendet wird. Um den ersten Teil dieser RNN zu erstellen, schrieb ich eine benutzerdefinierte Zelle, die Tensorflow aufrufen sollte. Aber ich bin nicht sicher, wie man die Resultate in einen LSTM sendet. Ist es möglich, die grundlegende LSTM-Zelle in der benutzerdefinierten Zelle, die ich schreibe, aufzurufen? Ich habe dies ein paar verschiedene Wege versucht, aber immer den Fehler "Modul 'Objekt hat kein Attribut' rnn_cell '" in der Zeile, wo die LSTM-Zelle aufgerufen wird. Jede Hilfe würde sehr geschätzt werden!

EDIT-Code hinzufügen:

Import numpy als np Import tensorflow als tf

Klasse MatchLSTMCell (tf.contrib.rnn.RNNCell):

def __init__(self, state_size, question_tensor, encoded_questions, batch_size): 
    self._state_size = state_size 
    self.question_tensor = question_tensor 
    self.encoded_questions = encoded_questions 
    self.batch_size = batch_size 

@property 
def state_size(self): 
    return self._state_size 

@property 
def output_size(self): 
    return self._state_size 

def __call__(self, inputs, state, scope=None): 
    scope = scope or type(self).__name__ 

    with tf.variable_scope(scope): 

     W_p = tf.get_variable("W_p", dtype=tf.float64, shape=[self.state_size, self.state_size], initializer=tf.contrib.layers.xavier_initializer()) 
     W_r = tf.get_variable("W_r", dtype=tf.float64, shape=[self.state_size, self.state_size], initializer=tf.contrib.layers.xavier_initializer()) 
     b_p = tf.get_variable("b_p", dtype=tf.float64, shape=[self.state_size]) 
     w = tf.get_variable("w", dtype=tf.float64, shape=[1,self.state_size]) 
     b = tf.get_variable("b", dtype=tf.float64, shape=[]) 

     #print 'question tensor', np.shape(self.question_tensor) 
     #print 'inputs', np.shape(inputs) 
     #print 'insides', np.shape(tf.matmul(inputs, W_p) + tf.matmul(state, W_r) + b_p) 
     G = tf.nn.tanh(
         tf.transpose(tf.transpose(self.question_tensor, perm=[1,0,2]) + 
         (tf.matmul(inputs, W_p) + tf.matmul(state, W_r) + b_p), perm=[1,0,2]) 
         ) 
     #print 'big G', np.shape(G) 

     attention_list = [] 
     for i in range(self.batch_size): 
      attention_matrix = tf.matmul(G[i,:,:], tf.transpose(w)) 
      attention_list.append(attention_matrix) 
     attention_scores = tf.stack(attention_list) 
     a = tf.nn.softmax(attention_scores + b) 
     a = tf.reshape(a, [self.batch_size, -1]) 
     #print 'a shape is', np.shape(a) 

     weighted_question_list = [] 
     for i in range(self.batch_size): 
      attention_vector = tf.matmul(tf.reshape(a[i], [1,-1]), self.encoded_questions[i]) 
      weighted_question_list.append(attention_vector) 
     weighted_questions = tf.stack(weighted_question_list) 
     weighted_questions = tf.reshape(weighted_questions, [32, -1]) 
     #print'weighted questions', np.shape(weighted_questions) 

     z = tf.concat([inputs, weighted_questions], 1) 
     lstm_cell = tf.nn.rnn_cell.LSTMCell(self.state_size) 
     output, new_state = lstm_cell.__call__(z, state) 

    return output, new_state 
+0

Ohne Code zu betrachten dies schwierig ist, und ich würde gerne helfen. Was Ihnen helfen würde, ist ein minimalistisches Testprogramm zu erstellen, das zeigt, dass Ihre benutzerdefinierte RNN funktioniert oder nicht und ein weiterer minimalistischer Test, wie Sie LSTM verwenden und ob das funktioniert oder nicht. Die gleichen beiden Programme würden anderen (einschließlich mir) beim Stack-Überlauf helfen, Ihr Problem zu beheben. – Wontonimo

+0

Vielen Dank! Ich werde diese Programme schreiben. Ich habe meinen Code dem Beitrag hinzugefügt, falls es hilfreich sein könnte, bis ich diese Programme schreiben kann. Danke für die Hilfe! –

Antwort

1

ich auch bin versucht, um Match_LSTM für Squad für das Experiment neu zu implementieren. Ich verwende MurtyShikhar's als Referenz. Es klappt! Allerdings musste er AttentionWrapper anpassen und existierte BasicLSTM-Zelle verwenden.

Ich versuche auch, einen Match_LSTM_cell zu schaffen, indem z und Staat als (Eingänge, Zustand) Paar in Basic_LSTM setzen:

def __call__(self, inputs,state): 
     #c is not a output. c somehow is a "memory keeper". 
     #Necessary to update and pass new_c through LSTM 
     c,h=state 

     #...Calculate your z 
     #...inputs will be each tokens in context(passage) respectively 
     #...Calculate alpha_Q 
     z=tf.concat([inputs,alpha_Q],axis=1) 

     ########This part is reimplement of Basic_LSTM 
     with vs.variable_scope("LSTM_core"): 
      sigmoid=math_ops.sigmoid 
      concat=_linear([z,h],dimension*4,bias=True) 
      i,j,f,o=array_ops.split(concat,num_or_size_splits=4,axis=1) 
      new_c=(c*sigmoid(f+self._forget_bias)+sigmoid(i)*self._activation(j)) 

      new_h = self._activation(new_c) * sigmoid(o) 
      new_state=(new_c,new_h) 
     return new_h,new_state 
Verwandte Themen