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