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
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
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! –