Модель вертикального ансамбля Keras с промежуточным условием

#python #python-3.x #keras #deep-learning #ensemble-learning

#python #python-3.x #keras #глубокое обучение #ансамбль-обучение

Вопрос:

Я обучил две отдельные модели

  • ModelA: проверяет, связан ли входной текст с моей работой (двоичный классификатор [связанный / не связанный])
  • ModelB: классификатор связанных текстов (классификатор [хороший / нормальный / плохой]). Только связанные тексты передаются в эту модель из ModelA

Я хочу

  • ModelC: классификатор ансамбля, который выводит [хороший / нормальный / плохой / не связанный]
  • Я буду тренироваться партиями. И в одной партии может быть сочетание not-related good/normal/bad и. Мне нужно, чтобы они были разделены.

Некоторый псевдокод того, что мне нужно

 # Output of modelA will be a vector I presume `(1, None)` where `None` is batch
def ModelC.predict(input):
    outputA = ModelA(input)
    if outputA == 'not-related':
        return outputA
    return ModelB(outputA)
 

Я не знаю, как включить if логику в вывод моделей. Как я могу этого добиться?

Ответ №1:

Просто определите свою собственную модель. Я удивлен, что другие ваши модели выводят строки вместо чисел, но без дополнительной информации это все, что я могу вам дать, поэтому я предполагаю, что вывод модели A представляет собой строку.

 import tensorflow as tf

class ModelC(tf.keras.Model):

  def __init__(self, A, B):
    super(ModelC, self).__init__()
    self.A = A
    self.B = B

  def call(self, inputs, training=False):
    x = self.A(inputs, training)
    if x == 'not-related':
        return x
    return self.B(inputs, training)
 

Комментарии:

1. Спасибо за ответ. Плюс извините, что не сделал мой вопрос более конкретным. У меня есть еще одно требование. Как это будет работать, если я тренируюсь пакетно? Я не знаю, как » в пакете if x == 'not-related': return x else return self.B(inputs, training)

2. Этот метод не будет работать для пакетного обучения. Поскольку для некоторых входных данных может потребоваться использовать B, а для других может потребоваться использовать A, было бы невозможно вернуться раньше. В этом случае вам было бы лучше 1) иметь значение, связанное / не связанное с выводом, равным 0-1, и 2) умножить слой A на слой B.

3.Если вы хотите изменить приведенный выше пример для работы со строками, я думаю, его можно заставить работать с помощью tf.where tensorflow.org/api_docs/python/tf/where . Вы не сэкономите вычисления, вернувшись раньше, но это должно выполнить работу. where(cond, x, y) дает вам тензор элементов из x, где cond равно true, и элементов из y, где cond равно false . Итак, примите x как результат A, а y — как результат B, а cond — как tf.equal(x, 'not-related')

4. Спасибо за ваш ответ. Я попробую то, что вы предложили, и отредактирую ваш ответ своим результирующим кодом. Еще раз спасибо