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