Как обрезать вывод CNN к заданному c списку цветов - PullRequest
3 голосов
/ 26 января 2020

Типичное изображение GAN имеет вывод формы (w,h,3) со значениями 0 ... 1, которые затем масштабируются до 0 ... 255 для представления цветного изображения.

Таким образом, в каждой позиции w, h мы получаем 3 значения, которые вместе представляют один цвет в пространстве RGB.

Я хочу как-то ограничить этот вывод, чтобы разрешить указывать только c цветов в качестве вывода. Например,

colours = [[200, 20, 20], [20, 200, 20], [20, 20, 200], ...] 
number_of_allowed_colours = len(colours)

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

До сих пор я безуспешно перепробовал много подходов. Я вижу, что это может быть достигнуто, когда последний слой сети будет иметь форму (w,h,number_of_allowed_colours), а затем применяется функция активации, чтобы отобразить это 3-е измерение в соответствующий цветовой триплет. Одна идея, которую я пытаюсь расширить, - это использовать что-то вроде tf.argmax в сочетании с tf.contrib.lookup.HashTable. Другой вариант, на который я обращаю внимание, это наличие слоя с обычной формой (w,h,3), но в процессе активации он округляется до ближайшего совпадения по цвету. Проблема здесь заключается в отсутствии градиента и в том, что не существует идеального алгоритма для сравнения цветов.

Отредактировано: функция потерь должна использовать сгенерированное выходное изображение, таким образом, решение должно быть полностью дифференцируемым. Выход сети должен быть (w,h,3) образным изображением.

1 Ответ

2 голосов
/ 05 февраля 2020

Нет способа узнать, сработает ли это на самом деле, но приведенные ниже предложения делают ваши концепции дифференцируемыми.

(w,h,number_of_allowed_colours), а затем применяется функция активации, чтобы сопоставить это 3-е измерение с соответствующим цветовой триплет. Одна идея, которую я пытаюсь расширить, - это использовать что-то вроде tf.argmax в сочетании с tf.contrib.lookup.HashTable. Еще один вариант, который я изучаю, - это регулярный (w,h,3)

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

Для первого, где вы сказали:

применяется функция активации ... tf.argmax ... lookup.HashTable.

То, что вы хотите здесь сделать, очень похоже на слой внимания. Используйте activation="softmax", чтобы получить взвешенное распределение по цветам, где веса равны единице. Возьмите средневзвешенное значение цветов.

Другой вариант, который я изучаю, - это иметь регулярное (w, h, 3), но в пределах активации округлить его до ближайшего совпадения по цвету. Проблема здесь заключается в отсутствии градиента и в том, что не существует идеального алгоритма для сравнения цветов.

Опять у вас есть правильная идея, и вам просто не хватает нескольких деталей, чтобы сделать ее дифференцируемой , Здесь я снова думаю, что вам может понадобиться взвешивание, равное одному. Вы можете получить это для каждой точки, вычислив расстояние до каждой цветовой опции и затем взяв softmax(-r**2) через опции. Таким образом, параметры закрытия получают больший вес, а параметры удаленного доступа взвешиваются в направлении нуля.

Усреднение цветов:

Не забудьте гамма-коррекция .

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