Нахождение маски потерь переменной длины в тенорном потоке Кераса - PullRequest
1 голос
/ 15 апреля 2019

Попытка построить функцию потерь, которая фиксирует нижеприведенную функциональность, которая маскирует выходные значения при обнаружении «конца последовательности».

Учитывая тензор формы [BatchSize, MaxSequenceLenght, OutputNodes]

Рассмотрим приведенный ниже пример


    batch size = 3
    Max Sequence Length=4
    OutputNodes = 3
    predicted = [[[0.1,0.3,0.2],[0.4,0.6,0.8],[0.5,0.2,0.3],[0.0,0.0,0.99]],
            [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.9],[0.4,0.6,0.8]],
            [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.1],[0.4,0.6,0.1]]]

Я посвящаю последний выходной узел символу «конца последовательности (EOS)» здесь node = 2. Узлы помечены как (0, 1 и 2)

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

В приведенном выше примере первая строка имеет следующую последовательность (argmax) => 1,2,0,2

Вторая строка имеет следующую последовательность => 1,1,2,2

Третья строка имеет следующую последовательность => 1,1,9,1

Так что моя маска должна быть

[[1,0,0,0],
[1,1,0,0],
[1,1,1,1]

Маска обеспечит, значения после EOS игнорируются или не учитываются при расчете потерь.

Ниже приведен фрагмент кода, который я пытался


    sequence_cluster_asign = keras.backend.argmax(sequence_values,axis=-1)
    loss_mask = []
    for seq in K.tf.unstack(sequence_cluster_asign):
        ##appendEOS- To make sure tf.where is not empty
        seq = tf.concat([seq,endOfSequenceTensor],axis=0)
        endOfSequenceLocation = K.tf.where(K.tf.equal(seq,endOfSequence))[0][0]
        loss_mask.append(tf.sequence_mask(endOfSequenceLocation,max_decoder_seq_length,dtype=tf.float32))
    final_mask = K.stack(loss_mask)

Ошибка: ValueError: Невозможно определить число по форме (?,?)

1 Ответ

1 голос
/ 15 апреля 2019

Если вы хотите получить маску в своем вопросе, вы можете использовать следующий метод.

import tensorflow as tf
import keras
from keras import backend as K

sequence_values = K.placeholder(shape=(None, 4, 3))
sequence_cluster_asign = keras.backend.argmax(sequence_values,axis=-1)

# keras version
result = K.cast(K.less(sequence_cluster_asign,sequence_values.get_shape().as_list()[-1]-1),dtype='int32')
result = K.cumprod(result,axis=-1)

# tensorflow version
# result = tf.cast(tf.less(sequence_cluster_asign,sequence_values.get_shape().as_list()[-1]-1),dtype=tf.int32)
# result = tf.cumprod(result,axis=-1)

predicted = [[[0.1,0.3,0.2],[0.4,0.6,0.8],[0.5,0.2,0.3],[0.0,0.0,0.99]],
             [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.9],[0.4,0.6,0.8]],
             [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.1],[0.4,0.6,0.1]]]

with tf.Session() as sess:
    print(result.eval(feed_dict={sequence_values:predicted}))

[[1 0 0 0]
 [1 1 0 0]
 [1 1 1 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...