Попытка построить функцию потерь, которая фиксирует нижеприведенную функциональность, которая маскирует выходные значения при обнаружении «конца последовательности».
Учитывая тензор формы [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: Невозможно определить число по форме (?,?)