Запуск функции потери CTC

#python #tensorflow #machine-learning #keras #neural-network

#python #тензорный поток #машинное обучение #keras #нейронная сеть

Вопрос:

Я хотел попробовать функцию потери CTC в наборе данных Shakespeare, и во время вычисления потери предсказанная форма тензора равна (64, 100, 65), которая не соответствует форме метки (64, 100. Итак, я использовал некоторую математику для преобразования размеров, но с ошибкой.

Код

 def loss(labels, logits):
  return tf.keras.losses.categorical_crossentropy(labels, logits)

example_batch_loss  = loss(labels=target_example_batch, logits=tf.math.argmax(tf.convert_to_tensor(example_batch_predictions), axis=-1, output_type=tf.int64))
  

Ошибка

не удается вычислить Mul, поскольку ожидалось, что ввод # 1 (основанный на нуле) будет тензором int64, но является двойным тензором [Op: Mul]

Пожалуйста, помогите мне найти решение для использования потери CTC.

Ответ №1:

Вы вводите значение argmax выходных данных модели, то есть индексы, в которых выходные данные имеют наибольшее значение. Потеря CTC (как и большинство функций потерь) работает с логитами, ненормализованным распределением вероятностей, создаваемым моделью. Следовательно, нет ничего плохого в том, чтобы иметь предсказание формы (64, 100, 65) и только целевого объекта (64, 100).

Однако обратите внимание, что CTC предназначен для обработки случаев, когда выходные данные модели намного длиннее целевого. Типичным вариантом использования является распознавание речи, когда у вас есть множество окон сигналов, соответствующих относительно небольшому количеству фонем. Если ваша выходная длина и целевая длина одинаковы, CTC вырождается до стандартной кросс-энтропии.

Предполагая, что example_batch_predictions это выходные данные вашей модели, прежде чем нормализовать их с помощью softmax, тогда вы должны сделать:

 example_batch_loss  = loss(labels=target_example_batch, logits=example_batch_predictions, axis=-1, output_type=tf.int64))