2017-09-25 2 views
0

J'ai écrit un code pour concevoir un réseau de mémoire à court terme dans Tensorflow. Le code a fonctionné après que j'ai fait beaucoup de changements et ai lu quelques commentaires dans ce site Web. Cette partie du code est important d'expliquer:Explication de la variable de réutilisation pour le réseau lstm dans tensorflow

tf.reset_default_graph() 
with tf.variable_scope("conv1"): 
    cell= tf.contrib.rnn.LSTMCell(n_hidden_units, forget_bias=0.0, state_is_tuple=True,reuse=tf.get_variable_scope().reuse) 
    outputs, final_state = tf.nn.dynamic_rnn(cell, X_in, initial_state=init_state, time_major=False,scope="conv1") 

La parcelle de fonction los est toujours comme ça: enter image description here.

Où, à un moment donné, la fonction de perte d'entraînement diminue et la fonction de perte de validation augmente. Je pense que ça ne doit pas être comme ça. Je voudrais demander si la réutilisation de la variable est juste dans mon code? et si vous avez une idée de ce qui ne va pas avec le graphique de la fonction de perte?

Merci d'avance.

Edit:

Je pensais que je devrais poster mon code, il sera donc plus facile à comprendre parce que je ne peux pas trouver une solution:

tf.reset_default_graph() 
x = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) 
y = tf.placeholder(tf.float32, [None, n_classes]) 
weights = { 
# (147, 128),tf.random_normal_initializer(mean=0.0, stddev=0.1) 
'in': tf.get_variable('W_in',shape=[n_inputs, n_hidden_units],initializer=tf.truncated_normal_initializer(stddev=0.5)), 
# (128, 5) 
'out': tf.get_variable('W_out',shape=[n_hidden_units, n_classes],initializer=tf.truncated_normal_initializer(stddev=0.5))} 
biases = { 
# (128,) 
'in': tf.get_variable('b_in',shape=[n_hidden_units, ],initializer=tf.random_normal_initializer(stddev=0.5)), 
# (5,) 
'out': tf.get_variable('b_out', shape=[n_classes, ],initializer=tf.random_normal_initializer(stddev=0.5))} 
def lstm_cell(): 
     return tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias=0.0, state_is_tuple=True,reuse=tf.get_variable_scope().reuse) 

def RNN(X, weights, biases): 
     X = tf.reshape(X, [-1, n_inputs]) 
     X_in = tf.nn.tanh(tf.matmul(X, weights['in']) + biases['in']) 
     X_in=tf.nn.dropout(X_in,keep_prob=0.5) 
     X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units]) 
     with tf.variable_scope("conv1"): 
      cell = lstm_cell() 
      cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=0.5) 
      init_state = cell.zero_state(tf.shape(X_in)[0], dtype=tf.float32) 
      outputs, final_state = tf.nn.dynamic_rnn(cell, X_in, initial_state=init_state, time_major=False,scope="conv1") 
     outputs = tf.unstack(tf.transpose(outputs, [1,0,2])) 
     results = tf.matmul(outputs[-1], weights['out']) + biases['out']  

     return results 

pred = RNN(x, weights, biases) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y)) 
train_op = tf.train.AdamOptimizer(0.0025).minimize(cost) 

Répondre

0

En général, si votre perte de validation commence à augmenter , cela signifie que votre réseau est trop adapté aux données d'entraînement. Vous pouvez réduire cela avec la régularisation, l'abandon ou d'autres méthodes. Vous devriez également essayer de diminuer le nombre total de neurones/couches dans votre réseau.

+0

J'ai essayé différents nombres de neurones mais le tracé est le même. J'ai essayé l'abandon avec la propabilité égale à 0.5 et l'intrigue précédente est le résultat. – mahmood227