Мой вопрос касается поиска эффективного (в основном с точки зрения подсчета параметров) способа реализации скользящего окна в тензорном потоке (1.4) для применения нейронной сети через изображение и создания двумерной карты с каждым пикселем (или регион), представляющий сетевой вывод для соответствующего восприимчивого поля (которое в данном случае является самим скользящим окном).
На практике я пытаюсь реализовать либо MTANN , либо PatchGAN с использованием тензорного потока, но я не могу понять реализацию, которую я нашел.
Две архитектуры можно кратко описать как:
MTANN: линейныйнейронная сеть с входным размером [1, N, N, 1] и выходным размером [] применяется к изображению размером [1, M, M, 1] для создания карты размера [1, G, G, 1], в котором каждый пиксель сгенерированной карты соответствует вероятности того, что соответствующий патч NxN будет принадлежать определенному классу.
PatchGAN Discriminator: Более общая архитектура, как я могу пристоять сеть, которая проходит через изображение выводит саму карту вместо одного значения, которое затем объединяется со смежными картами для получения окончательной карты.
Хотя я не могу найти тензор потокаПри реализации MTANN я обнаружил реализацию PatchGAN , которая рассматривается как сверточная сеть , но я не мог понять, как реализовать это на практике.
Допустим, я получил предварительно обученную сеть, из которой получил выходной тензор.Я понимаю, что свертка - это путь, поскольку сверточный слой работает над локальной областью ввода, и то, что я пытаюсь сделать, может быть четко представлено как сверточная сеть.Однако что, если у меня уже есть сеть, которая генерирует подкарты из заданного окна фиксированного размера?
Например, я получил тензор
sub_map = network(input_patch)
, который возвращает [1,2,2,1] карты из изображения [1,8,8,3] (соответствует 3-х слойному FCN с размером входа 8, размером фильтра 3x3).Как можно развернуть эту сеть на [1,64,64,3] изображениях, чтобы получить карту [1,64,64,1], составленную из каждого пространственного вклада, как это происходит в свертке?
Я рассмотрел следующие решения:
Использование tf.image.extract_image_patches
, которое явно извлекает все патчи и каналы изображения в измерении глубины, но я думаю, что это потребует слишком много ресурсов, так какЯ переключаюсь на PatchGAN Discriminator из полностью сверточной сети из-за ограничений памяти - также состав финальной карты не так прост.
Добавление сверточного слоя перед сетью, которую я получил, но я не могу понять, каким должен быть фильтр (и его размер) в этом случае, чтобы сохранить работу предварительно подготовленной модели на 8x8изображения при интеграции его в модель, которая работает с большими изображениями.Для того, что я могу получить, это должно быть что-то вроде whole_map = tf.nn.convolution(input=x64_images, filter=sub_map, ...)
, но я не думаю, что это сработает, поскольку фильтр является оператором, который зависит от самого рецептивного поля.
ОкончательныйЦель состоит в том, чтобы эффективно применить эту маленькую сеть к большим изображениям (например, 1024x1024), поскольку моя текущая модель постепенно уменьшает изображения и не помещается в памяти из-за огромного количества параметров.
Может кто-нибудь помочь мне лучше понять, чего мне не хватает?
Спасибо