tensorflow sequence_loss_by_example вес

Я хочу сделать тензоры веса для tf.nn.seq2seq.sequence_loss_by_example.
Я использую RNN-LSTM с максимальными 100 шагами и нулевым заполнением каждого пакета максимальными шагами (100).

Формы моих логитов и меток таковы.

Tensor("dropout/mul_1:0", shape=(50000, 168), dtype=float32) # logits
Tensor("ArgMax:0", shape=(500, 100), dtype=int64)            # labels

50000 — это 500(batch_size) * 100 (num_steps), и 168-это количество классов, и я передаю их в sequence_loss_by_example как ptb_word_lm.py код предоставлен Tensorflow. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/rnn/ptb/ptb_word_lm.py

loss = tf.nn.seq2seq.sequence_loss_by_example(
            [logits],
            [tf.reshape(labels, [-1])],
            [tf.ones([cf.batch_size * cf.max_time_steps], dtype=tf.float32)])

Однако из-за того, что мои логиты и метки заполнены нулем, потери неверны. Из этого ответа, https://stackoverflow.com/a/38502547/3974129 , я пытался изменить tf.те.[(.]) часть к тензорам веса, но их основные условия слишком отличаются от моих.

У меня есть информация о длине шага, как показано ниже, и я кормлю их при обучении.

self._x_len = tf.placeholder(tf.int64, shape=[self._batch_size])

Например, сведения о длине канала[3, 10, 2, 3, 1] для серии размера 5. Они также используются для sequence_length в tf.nn.rnn ().

Один из способов, который я могу придумать, это итерация x_len, и использовать каждый элемент в качестве индекса последнего 1 в каждом весе.

[0 0 0 0 0 …. 0 0 0] => [1 1 1 … 1 0 0 0 0]

тензор веса с размером 100 (максимальный шаг по времени)

Но, как вы знаете, я не могу использовать значения внутри тензора для индекса, потому что они еще не поданы.

Как я могу сделать тензоры веса, как это?

1 ответ