#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. Спасибо за ваш ответ. Я попробую то, что вы предложили, и отредактирую ваш ответ своим результирующим кодом. Еще раз спасибо