Объединение двух предварительно обученных моделей с 2 ​​различными классами (набором данных) для прогнозирования - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две предварительно обученные и сохраненные начальные модели.

Модель 1 = начальная модель с классами Imagenet - она ​​может прогнозировать изображение в 1000 классах.

модель 2 = начальная модель сМоя собственная классификация (20 классов) - она ​​может предсказать изображение в 20 классах.Выполнил трансферное обучение и сохранил модель.

Я хотел бы объединить это для прогнозирования изображений с 1020 классами.

Model1 = inception_v3.InceptionV3(weights='imagenet')

Предсказывает изображение в 1000 классах

predictions1 = Model1.predict(processed_image)

Model2 = InceptionV3(weights='imagenet',
              include_top=False,
              input_shape=(224, 224, 3))

Я выполнил трансферное обучение с моими собственными 20 классами.Одна и та же форма ввода для обеих моделей.Предсказывает изображение в 20 классах

predictions = Model2.predict_classes(precessed_image)

Как объединить 2 модели предварительного обучения для прогнозирования классов Imagenet (1000) и моих собственных классификаторов (20 классов) = прогнозировать изображения в 1020 классах?

Пожалуйста, дайте мне ваше решение с небольшим фрагментом (кодом) в качестве примера для лучшего понимания.Я довольно новичок в Керасе.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы хотели бы объединить предварительно обученные метки модели с собственными метками, или, другими словами, вы дополняете предварительно обученную модель новыми классами.Практический подход заключается в использовании основ трансфертного обучения.

Но позвольте мне сказать вам это, это все еще горячая тема исследования.Проще переучить свои собственные классы, чем добавлять дополнительные классы.Трудно, не невозможно!

Что вы должны делать: Один из способов сделать это - изменить последний слой softmax, чтобы идентифицировать больше классов, чем он предназначен для маркировки. Сетевая хирургия .Вам придется снова обучать модель, и это займет больше времени.

Другой способ - создать новую пользовательскую модель со всеми 1020 метками и обучить ее по всему набору данных, что не очень эффективно, и вы не можетеиспользуйте веса из предварительно обученной модели, и вам придется снова выполнить полное обучение.

Взлом может быть использованием контрольной точки, которая уже предсказывает 1000 классов.Добавьте свои данные для нового класса.Теперь вы должны объединить данные нового класса с набором данных Imagenet, создать TFRecords для всех 1020 классов и тренироваться с контрольной точки сети.

То, что вы пытаетесь сделать, называется " обучение, не забывая ".Пожалуйста, обратитесь к приведенному ниже документу для получения дополнительной информации о том, как реализовать это.

https://arxiv.org/abs/1606.09282

И код Matlab доступен здесь.

https://github.com/lizhitwo/LearningWithoutForgetting

Вы также можете попробовать настроить приведенный ниже файл, чтобы получить желаемый результат.

https://github.com/tensorflow/hub/blob/master/examples/image_retraining/retrain.py

Кроме того, для получения дополнительной информации о переподготовке с использованием моделей с предварительной подготовкой см. Ссылку ниже.

https://www.tensorflow.org/tutorials/images/hub_with_keras

Теперь перейдем к ответу,

Как мы это сделаем:

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

Для этого необходимо указать два флага:

1. --pretrained_model_checkpoint_path
2. --fine_tune

Код будет выглядеть следующим образом.

# Build the model. Note that we need to make sure the TensorFlow is ready to
# use before this as this command will not build TensorFlow.
cd tensorflow-models/inception
bazel build //inception:custom_train

# Path to the downloaded Inception-v3 model.
MODEL_PATH="${INCEPTION_MODEL_DIR}/inception-v3/model.ckpt-1456935"

# Directory where the data resides.
DATA_DIR=/tmp/custom-data/

# Directory where to save the checkpoint and events files.
TRAIN_DIR=/tmp/custom_train/

# Run the fine-tuning on the flowers data set starting from the pre-trained
# Imagenet-v3 model.
bazel-bin/inception/flowers_train \
  --train_dir="${TRAIN_DIR}" \
  --data_dir="${DATA_DIR}" \
  --pretrained_model_checkpoint_path="${MODEL_PATH}" \
  --fine_tune=True \
  --initial_learning_rate=0.001 \
  --input_queue_memory_factor=1

Для получения дополнительной информации см. Приведенную ниже документацию.

https://github.com/tensorflow/models/tree/master/research/inception

0 голосов
/ 06 февраля 2019

Здесь нет правильного ответа.Что вы можете сделать, например, запустить изображение через оба классификатора и посмотреть, чей лучший прогноз имеет более высокую достоверность.Другим вариантом может быть создание простого классификатора, с помощью которого вы будете запускать свое изображение и чей прогноз будет двоичным и сообщит вам, какую модель использовать (1-начало, 0-ваша модель).Другой вариант - посмотреть распределение прогноза.Например, если вы запускаете какое-либо изображение через свой классификатор, если объект в изображении не входит ни в один из этих 20 классов, распределение прогноза будет примерно одинаково распределено между несколькими классами, но ни один из них не будет выделяться, у всех из них будет большеили менее такая же уверенность.Обычно это означает, что изображение не входит в сферу действия классификатора - модель не знает, куда поместить изображение, потому что это не тот объект, который она видела ранее, поэтому она не может принять решение.

РЕДАКТИРОВАТЬ

Скажем, model - это простой двоичный классификатор, который классифицирует изображения для начала в классе 1 и изображения для вашей модели в классе 0.Тогда вы могли бы сделать что-то вроде этого:

# open image
img = Image.open(path_to_image)

if model.predict(img): # positive case (classifier classified img to class '1')
  prediction = inception_model.predict(img)
else: # negative case (classifier classified img to class '0')
  prediction = my_model.predict(img)

Теперь результат прогноза находится в переменной prediction.Здесь я использовал этот простой классификатор (model), чтобы предсказать, какая модель будет фактически использоваться для классификации изображения (начальная или ваша модель).Если используется начало, prediction будет 1000-мерным вектором, а если используется my_model, prediction будет 20-мерным вектором.Но это не имеет значения, потому что вы можете просто получить самое высокое значение предсказания независимо от размера вектора и работать с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...