Я хотел бы сделать что-то похожее на документ Fully Convolutional Networks (https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf) с помощью Keras. У меня есть сеть, которая заканчивает выравнивание карт функций и запускает их через несколько плотных слоев. Я хотел бы загрузить весы из такой сети в одну, где плотные слои заменяются эквивалентными свертками.
В качестве примера можно использовать сеть VGG16, которая поставляется вместе с Keras, где вывод 7x7x512 последнего MaxPooling2D() сглажен, а затем переходит в слой Dense (4096). В этом случае Dense (4096) будет заменен сверткой 7x7x4096.
Моя реальная сеть немного отличается, есть слой GlobalAveragePooling2D() вместо MaxPooling2D() и Flatten(). Вывод GlobalAveragePooling2D() является двумерным тензором, и нет необходимости дополнительно его сглаживать, поэтому все плотные слои, включая первый, будут заменены на 1x1 свертки.
Я видел этот вопрос: Python keras, как преобразовать плотный слой в сверточный слой, который кажется очень похожим, если не идентичным. Проблема в том, что я не могу заставить предлагаемое решение работать, потому что (а) я использую TensorFlow в качестве бэкэнд, поэтому перестановка/фильтрация весов "неправильная", и (б) я не могу понять как загрузить вес. Загрузка старого файла весов в новую сеть с помощью model.load_weights(by_name=True)
не работает, потому что имена не совпадают (и даже если они отличаются друг от друга).
Какова должна быть перестановка при использовании TensorFlow?
Как загрузить вес? Создать одну из каждой модели, вызвать model.load_weights() для загрузки одинаковых весов, а затем скопировать некоторые дополнительные веса, которые нуждаются в перестановке?