2016-07-21 8 views
1

Tensorflow unterstützt dynamische Längensequenz unter Verwendung des Parameters: 'sequence_length' während der Konstruktion der RNN-Schicht, wobei das Modell die Sequenz nicht nach der Sequenzgröße = 'sequence_length' lernt, d. H. Nullvektor zurückgibt.Wie ändert man die seq2seq Kostenfunktion für gepolsterte Vektoren?

Wie aber kann die Kostenfunktion bei https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/seq2seq.py#L890 geändert werden, um die maskierten Sequenzen zu treffen, so dass Kosten und Ratlosigkeit nur auf den tatsächlichen Sequenzen und nicht auf der ganzen aufgefüllten Sequenz berechnet werden?

def sequence_loss_by_example(logits, targets, weights, average_across_timesteps=True, softmax_loss_function=None, name=None): 

    if len(targets) != len(logits) or len(weights) != len(logits): 
     raise ValueError("Lengths of logits, weights, and targets must be the same " 
         "%d, %d, %d." % (len(logits), len(weights), len(targets))) 
     with ops.op_scope(logits + targets + weights, name, 
         "sequence_loss_by_example"): 
     log_perp_list = [] 
     for logit, target, weight in zip(logits, targets, weights): 
      if softmax_loss_function is None: 
      # TODO(irving,ebrevdo): This reshape is needed because 
      # sequence_loss_by_example is called with scalars sometimes, which 
      # violates our general scalar strictness policy. 
      target = array_ops.reshape(target, [-1]) 
      crossent = nn_ops.sparse_softmax_cross_entropy_with_logits(
       logit, target) 
      else: 
      crossent = softmax_loss_function(logit, target) 
      log_perp_list.append(crossent * weight) 
     log_perps = math_ops.add_n(log_perp_list) 
     if average_across_timesteps: 
      total_size = math_ops.add_n(weights) 
      total_size += 1e-12 # Just to avoid division by 0 for all-0 weights. 
      log_perps /= total_size 
    return log_perps 

Antwort

1

Diese Funktion unterstützt bereits die Berechnung der Kosten für dynamische Sequenzlängen durch die Verwendung von Gewichten. Solange Sie die Gewichte 0 für die „padding-Ziele“, die Kreuzentropie für diese Schritte auf 0 geschoben wird sicherstellen:

log_perp_list.append(crossent * weight) 

und die Gesamtgröße auch nur die nicht-padding Schritte widerspiegeln:

total_size = math_ops.add_n(weights) 

Wenn Sie mit Nullen Klotzen sind, ist eine Möglichkeit, die Gewichte wie folgt abzuleiten:

weights = tf.sign(tf.abs(model.targets)) 

(Beachten Sie, dass diese auf die gleiche Art wie Sie Ihre Ziele müssen möglicherweise werfen)

+0

Ich habe das nur gemacht. Wenn ich jedoch das Ptb-Modell (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/models/rnn/ptb) für das Sequenzlernen auf Satzebene verwende, bekomme ich eine andere Art von Kosten und Ratlosigkeit. Deshalb habe ich darüber nachgedacht, ob wir etwas anpassen müssen. Ab sofort lernt das Modell die kontinuierliche Sequenz über alle Trainingsdaten. Ich habe es nur geändert, um Sequenzen auf Satzebene zu lernen und habe daher alle Sätze mit 0 aufgefüllt, um sie gleich zu machen. Länge. – user3480922

+0

Okay! Ich habs. Ich hatte es versäumt, einige Parameter wie Iter und Epoche für die endgültige Berechnung zu aktualisieren. Jetzt funktioniert es gut. Vielen Dank. – user3480922

Verwandte Themen