Как использовать предварительно обученные модели без классов в Tensorflow?

Я пытаюсь использовать предварительно обученную сеть, например tf.keras.applications.ResNet50, но у меня две проблемы:

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

  • tf.keras.applications.ResNet50 принимает параметр по умолчанию 'classes=1000'

    • Is there a way how I can omit this parameter?
  • Мои входные изображения имеют размер 128*128*1 пикселя, а не 224*224*3

    • What is the best way to fix my input data shape?

Моя цель - создать сеть с тройными потерями с выходом resnet сети.

Большое спасибо!


person Tbertin    schedule 01.06.2018    source источник
comment
По первому вопросу: вы можете создать всю сеть, загрузить предварительно обученные веса, а затем отбросить последний слой.   -  person phi    schedule 01.06.2018
comment
По второму вопросу: вы можете поискать какую-нибудь современную архитектуру, которая может поддерживать любой размер изображения. (Они используют Adaptive Pooling вместо Max Pooling).   -  person phi    schedule 01.06.2018


Ответы (2)


  • ResNet50 имеет параметр include_top именно для этой цели - установите его в False, чтобы пропустить последний полностью подключенный слой. (Затем он выводит вектор признаков длиной 2048).
  • Лучший способ уменьшить размер изображения - это изменить размер изображения, например с помощью специальной функции tf.image.resample_images.

    • Кроме того, я сначала не заметил, что ваши входные изображения имеют только три канала, спасибо @Daniel. Я предлагаю вам создать свое трехканальное изображение в градациях серого на графическом процессоре (а не на хосте с помощью numpy), чтобы избежать утроения передачи данных в память графического процессора, используя tf.tile:

      im3 = tf.tile(im, (1, 1, 1, 3))
      
person P-Gn    schedule 01.06.2018

В дополнение к другому ответу. Вам также нужно будет сделать ваши изображения трехканальными, хотя технически это не лучший ввод для Resnet, это самое простое решение (изменение модели Resnet также является вариантом, если вы посетите исходный код и измените форму ввода самостоятельно).

Используйте numpy для упаковки изображений по трем каналам:

images3ch = np.concatenate([images,images,images], axis=-1)
person Daniel Möller    schedule 01.06.2018