Деконволюция изображения с CNN - PullRequest
3 голосов
/ 25 января 2020

У меня есть входной тензор shape (C,H,W), где H=W и C=W^2. Этот тензор содержит нелинейно преобразованную информацию для изображения shape (1,H,W), сжатого до (H,W). Точная форма преобразования не важна (плюс, для нее все равно нет выражения в замкнутой форме). Я хотел бы разработать CNN для оценки изображений из таких тензоров. Я понимаю, что мне придется экспериментировать с CNN architectures (поскольку у меня нет точной формы преобразования), но я не совсем уверен, как действовать дальше.

Входной тензор имеет как положительные, так и отрицательные значения, которые важны для восстановления изображения, поэтому ReLU layer, вероятно, не следует реализовывать в начале CNN. Я не думаю, что объединение слоев было бы полезно, по крайней мере, в измерениях H и W. Ясно, что мне нужно свернуть измерение C, чтобы получить изображение, но я не думаю, что это должно быть сделано сразу, e.g., torch.nn.Conv2d( C, 1, kernel_size ), вероятно, не очень хорошая идея.

Кажется, мне, что я должен сначала использовать Conv2D layer, который производит тот же тензор размера, что и входной тензор (чтобы частично расшифровать нелинейное преобразование), но если размер ядра на больше , чем один, то H и размеры W будут уменьшены в размере, чего я не хочу (если только это не будет решено позже в CNN). С другой стороны, если размер ядра равен единице, форма останется такой же , но я не думаю, что в этом случае что-то случится с тензором. Кроме того, мне, вероятно, придется включить линейные слои, но я не уверен, как использовать их с 3D тензорами.

Любые предложения приветствуются.

1 Ответ

2 голосов
/ 25 января 2020

Нет проблем с применением слоя ReLU в начале, если вы сначала применяете взвешенный линейный слой. Если net узнает, что ему нужны значения там, он может применить отрицательный вес для сохранения информации (грубо говоря).

На самом деле, в некоторых сетях полезно сделать нормализацию ввода соответствовать нормальному распределению N (0, 1). См. https://www.researchgate.net/post/Which_data_normalization_method_should_be_used_in_this_artificial_neural_network

Что касается проблемы «уменьшения» размеров H / W из-за размеров ядра - вы, вероятно, можете использовать 0-отступы на границах, чтобы избежать этой проблемы. По моему опыту, сети обычно справляются с этим относительно хорошо. Однако, если производительность является проблемой, обычно вам может понадобиться значительно уменьшить разрешение, а затем выполнить какое-то масштабирование в конце. Вы можете найти пример такой сети здесь: Создать изображение структуры нейронной сети

Что касается пула / векторных слоев: потому что глубина тензора очень большая (W ^ 2) Я бы посоветовал вам на самом деле уменьшить это сразу. Сложность вашей сети составляет quadrati c в глубине ваших тензоров и в количестве пикселей, из-за весов из / в каждый слой в тензоре. Итак, моя базовая стратегия c заключается в том, чтобы вначале быстро сократить информационное пространство, выполнить несколько уровней вычислений и затем увеличить масштаб.

За годы я понял, что CNN довольно устойчивы. и то, что архитектурные идеи, которые могут показаться хорошими на бумаге, в реальности делают очень мало - лучшие факторы - это всегда много слоев (выполненных хорошим способом, но с Re sNet это стало намного проще) и больше / лучше данных. Поэтому я бы начал экспериментировать и пытаться оценить, учитывая работающий Po C, что блокирует сеть, или попробовать варианты.

Надеюсь, в этом есть смысл :) Удачи!

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