Как бы я мог go создать модель keras с различным количеством целей / выходов? - PullRequest
1 голос
/ 26 мая 2020

Я создал регрессионную модель нейронной сети, используя Keras с одной целью. Это нормально работает, теперь я хотел бы включить несколько целей. Набор данных включает в общей сложности 30 целей, и я бы предпочел обучить одну нейронную сеть вместо 30 разных.

Моя проблема в том, что при предварительной обработке данных мне нужно удалить некоторые целевые значения для приведенный пример, поскольку они представляют нефизические значения, которые не подлежат предсказанию. Это создает проблемы, у меня есть разное количество целей / результатов. Например: Цели =

  1. Нет, 0,007798, 0,012522
  2. 0,261140, 2110,000000, 2440,000000
  3. 0,048799, Нет, Нет

Как мне go создать keras. Последовательная модель (или функциональная) с различным количеством выходов для заданного входа? количество выходов с учетом некоторых тестовых входов, а затем изменить количество выходов в выходном слое в соответствии с этим прогнозом? Полагаю, мне пришлось бы использовать функциональный API для чего-то вроде этого.
Редактирование «классификации» здесь не нужно, т.е. игнорировать его. Количество выходов тестовых целей - известная величина.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

(Извините, у меня недостаточно репутации, чтобы комментировать) Во-первых, знаете ли вы заранее, будут ли некоторые из выходных значений недопустимыми или это часть проблемы с прогнозированием, какие выходные данные будут действительно действительными?

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

Если это детерминировано c (и вы знаете, как это сделать), какие выходы будут действительными для любого данного входа, и ваша проблема только в том, как настроить правильную модель, вот как я бы сделал это в keras :

  • Используйте функциональный API
  • Создайте 30 именованных выходных слоев (например, out_0, out_1, ... out_29)
    • При создании модели просто используйте аргумент output для перечисления всех 30 выходов
  • При компиляции модели укажите потери для каждого отдельного вывода, вы можете сделать это, передав словарь в аргумент потери, где ключи - это имена ваших выходных слоев, а значения представляют собой соответствующие потери
    • Предполагая, что вы будете использовать среднеквадратичную ошибку для всех выходных данных, словарь будет выглядеть примерно так {'out_0': 'mse', 'out_1': ' mse ', ...,' out_29 ':' mse '}
  • При передаче входных данных в модели передайте три вещи для каждого входа: x, y, веса потерь
    • y должен быть словарем, где ключ - это выходной слой, называемый e, а значение - это целевое выходное значение
    • Веса потерь также являются словарем в том же формате, что и y. Веса в вашем случае могут быть просто двоичными, 1 для каждого выхода, который соответствует реальному значению, 0 для каждого выхода, который соответствует нефизическим значениям (поэтому они не учитываются во время обучения) для любого заданного образца
    • Don ' t pass None для нефизических целевых значений, используйте какой-нибудь заполнитель numeri c, иначе вы получите проблемы. Совершенно неважно, что вы используете для своего наполнителя, так как он не повлияет на градиенты во время обучения

Это даст вам обучаемую модель. НО после того, как вы перейдете от обучения и попытаетесь предсказать новые данные, ВАМ придется решить, какие выходные данные игнорировать для каждой выборки, сеть, скорее всего, по-прежнему будет давать вам «действительные» выходы для этих входов.

0 голосов
/ 26 мая 2020

Одним из возможных решений было бы иметь отдельный вывод «флагов действительности», принимающий значения в диапазоне от нуля до единицы. Например, ваша первая цель будет

y=[0.0, 0.007798, 0.012522]
yf=[0.0, 1.0, 1.0]

, где нули указывают на недопустимые значения. Используйте сигмовидную функцию активации для yf. Функция потерь может быть суммой потерь для y и yf. Во время вывода проанализируйте выходной сигнал сети для yf и считайте значение y действительным только в том случае, если соответствующее yf превышает пороговое значение

на 0,5
...