Модель Keras с несколькими выходами и несколькими классами

Для каждого входа, который у меня есть, у меня есть связанная матрица 49x2. Вот как выглядит 1 пара ввода-вывода

input :
[Car1, Car2, Car3 ..., Car118]

output :
[[Label1 Label2]
 [Label1 Label2]
      ...
 [Label1 Label2]]

Где оба Label1 и Label2 являются LabelEncode и имеют соответственно 1200 и 1300 различных классов.

Просто чтобы убедиться, что это то, что мы называем мультиклассовой задачей с несколькими выходами?

Я попытался сгладить вывод, но боялся, что модель не поймет, что все похожие метки имеют одни и те же классы.

Есть ли слой Keras, который обрабатывает вывод этой своеобразной формы массива?


person Julien Bélanger    schedule 17.01.2017    source источник


Ответы (1)


Как правило, проблемы с несколькими классами соответствуют моделям, выдающим распределение вероятностей по набору классов (которое обычно оценивается по сравнению с однократным кодированием фактического класса посредством кросс-энтропии). Теперь, независимо от того, структурируете ли вы его как один единственный выход, два выхода, 49 выходов или 49 х 2 = 98 выходов, это будет означать наличие 1200 х 49 + 1300 х 49 = 122 500 единиц вывода - что не то, что компьютер не может сделать. ручка, но, возможно, не самая удобная вещь. Вы можете попробовать, чтобы каждый вывод класса был одной (например, линейной) единицей и округлял ее значение, чтобы выбрать метку, но, если метки не имеют какого-либо числового значения (например, порядок, размеры и т. д.), это вряд ли сработает .

Если порядок элементов на входе имеет какое-то значение (то есть его перетасовка повлияет на результат), я думаю, что подойду к проблеме через RNN, например, LSTM или двунаправленную модель LSTM, с двумя выходами. Используйте слои softmax return_sequences=True и TimeDistributed Dense для выходных данных, и для каждого 118-длинного ввода у вас будет 118 пар выходных данных; затем вы можете просто использовать временное взвешивание выборки, чтобы отбросить, например, первые 69 (или, может быть, сделать что-то вроде отбрасывания 35 первых и 34 последних, если вы используете двунаправленную модель) и вычислить потери с оставшимися 49 парами маркировки. Или, если это имеет смысл для ваших данных (а может и нет), вы можете использовать что-то более продвинутое, например CTC (хотя в Keras его нет, пытаюсь интегрировать реализация TensorFlow без особого успеха), что также реализован в Keras (спасибо @indraforyou)!.

Если порядок на входе не имеет значения, но порядок выходов имеет значение, то у вас может быть RNN, где ваш вход представляет собой исходный 118-длинный вектор плюс пара меток (каждая с горячим кодированием), а выход снова пара меток (опять два слоя softmax). Идея заключалась бы в том, что вы получаете одну «строку» вывода 49x2 в каждом кадре, а затем отправляете ее обратно в сеть вместе с начальным вводом, чтобы получить следующий; во время обучения ввод будет повторяться 49 раз вместе с «предыдущей» меткой (пустая метка для первой).

Если нет последовательных взаимосвязей, которые можно было бы использовать (т. е. порядок ввода и вывода не имеет особого значения), то проблема будет действительно представлена ​​только исходными 122 500 единицами вывода (плюс все скрытые единицы, которые вам могут понадобиться для обработки). получить их правильно). Вы также можете попробовать какую-то золотую середину между обычной сетью и RNN, где у вас есть два вывода softmax и, наряду с вектором длиной 118, вы включаете «id» вывода, который вы хотите (например, как 49 -длинный вектор горячего кодирования); если «значение» каждой метки на каждом из 49 выходов одинаково или сопоставимо, это может сработать.

person jdehesa    schedule 18.01.2017
comment
Есть пример Keras с использованием потери CTC. Проверьте github.com/fchollet/ keras/blob/master/examples/image_ocr.py .. поддерживаются как tensorflow, так и theano - person indraforyou; 18.01.2017
comment
@indraforyou WAAAT У Кераса есть CTC?! Я думаю, что я где-то читал, что это не так (вероятно, о какой-то старой версии) и даже не проверил должным образом... позор мне! :S Большое спасибо за упоминание об этом. - person jdehesa; 18.01.2017
comment
Спасибо! Каждый из моих выходных наборов имеет внутреннюю иерархию. Моей следующей вехой является реализация переменного количества строк в каждом выходном наборе, что сделало бы эту проблему переменной с несколькими выходами и несколькими классами. Как вы думаете, справится ли и с этой задачей RNN LSTM? - person Julien Bélanger; 18.01.2017
comment
@JulienBélanger Я думаю, что RNN могут помочь, хотя, если вы не знаете длину вывода заранее, сложная часть, конечно, будет заключаться в том, чтобы узнать, когда начинается и заканчивается интересный вывод во время прогнозирования. Если вы рассматриваете ввод как последовательность, то вывод должен быть не больше длины ввода, и вы можете использовать что-то вроде CTC (хотя это больше похоже на сегментацию входной последовательности и присвоение метки каждому сегменту, что я не уверен, если это то, что вы хотите). Если ваш ввод не является последовательностью, и вы все еще используете RNN, вам нужно решить, когда остановиться! - person jdehesa; 18.01.2017
comment
@jdehesa нет проблем - person indraforyou; 18.01.2017
comment
@jdehesa Привет, у меня похожий вопрос, и я подумал, что у вас могут быть интересные предложения: stackoverflow.com/questions/62077273/, пожалуйста, дайте мне знать ваши мысли. благодарю вас :) - person EmJ; 29.05.2020