Как использовать DBN для восстановления изображений с разреженной матрицей с шаблоном затухания
У меня есть набор данных, содержащий изображения размером 30 х 15 пикселей. В этом наборе данных есть следы, идущие слева направо с некоторым изменением в направлении y. Трассировки обычно начинаются с (20, 0). Каждый следующий пиксель - один справа и псевдослучайно один сверху, снизу или одинаковой высоты. Например, следующий массив содержит правдоподобные точки, идущие вправо [(19, 1), (20, 1), (21, 1)].
Теперь я хочу обучить глубокую веру, состоящую из 2-х слоев машин с ограниченным движением Больцмана (1200 и 2400 фильтров) на полных трассах. Тестовый набор данных состоит из похожих (но не идентичных) трасс, но трасса составляет только половину длины.
Затем я пытаюсь использовать генеративные свойства DBN для прогнозирования оставшихся пикселей.
Сначала я взял сеть, которая может предсказывать MNIST-подобные изображения как проверку работоспособности и отправную точку. Это сработало хорошо. Пожалуйста, смотрите изображение ниже. Изображение: воссоздание MNIST-подобных изображений. Слева: полный след; Середина: половина следа; Справа: сгенерированное изображение из сети
Затем я изменил сеть, сгенерировал ранее описанные входные данные и обучил сеть. При удалении левой части данных сеть может повторно генерировать данные (хотя, не совсем верно, она генерирует пиксели). Пожалуйста, смотрите изображение ниже.
Изображение: воссоздание следа слева. Слева: полный след; Середина: половина следа; Справа: сгенерированное изображение из сети
Теперь я пытаюсь воссоздать направо. Иногда генерируется один пиксель, чаще всего ничего не генерируется. Пожалуйста, смотрите изображение ниже. Изображение: воссоздание следа справа. Слева: полный след; Середина: половина следа; Справа: сгенерированное изображение из сети
Чтобы убедиться, что сеть действительно чему-то научилась, я визуализировал первые 20 фильтров. Они показывают разветвление от (20,0). Это образец того, чего я ожидал, и он показывает мне, что сеть чему-то научилась. Пожалуйста, смотрите изображение ниже. Изображение: визуализация разного веса
Чтобы убедиться, что моя сеть действительно может генерировать похожие данные, я создал набор данных с горизонтальными полосами. Я разрезал столбики пополам и позволил сети генерировать оставшиеся пиксели. Это может сделать это без проблем. Пожалуйста, смотрите изображение ниже. Слева: полный след; Середина: половина следа; Справа: сгенерированное изображение из сети
Мой исходный набор данных содержит только 0 или 1 в качестве значений в переменной с плавающей запятой. Одна из моих догадок состоит в том, что он не может пройти определенный порог для перехода от 0 до 1. Я также попытался назначить равномерные случайные значения между 0 и 1. В результате фактически удаляются пиксели. (см. изображение ниже) Слева: полный след; Середина: половина следа; Справа: сгенерированное изображение из сети
Вес также кажется менее интенсивным:
Вопрос: Что я должен изменить, чтобы изображение восстанавливало недостающие пиксели справа?
Примечание. Учитывая фильтры, показывающие шаблоны, которые я ожидал, я не думаю, что тренировка дольше / тренировка с большим количеством данных / углубление сети / изменение скорости обучения - это обязательно ответ, но я не могу исключить это
Возможные идеи:
- Надуйте веса на правой стороне
- Вынуждайте / поощряйте (каким-то образом) больше изменений в изображении / снижайте порог изменения (каким-то образом)
- Создайте набор данных, в котором значение пикселей в трассе увеличивается и уменьшается при движении вправо (в отличие от случайного назначения)
PS Советы по альтернативным сетям в порядке, но я действительно ищу решение с использованием DBN/RBM