ML неверный прогноз в японском кроссворде - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь изучить машинное обучение на практике. Я нашел для себя упражнение по созданию нейронной сети, которая решает «японские кроссворды» для изображений фиксированного размера (128 * 128).

Очень простой пример (4 * 4) демонстрирует концепцию: черно-белое изображение, закодированное сверху и левые матрицы. Число в матрице означает продолжение длины черной линии. Легко доказать, что левая и верхняя матрица имеют размерность при max (N * (N / 2)) и ((N / 2) * N) соответственно.

enter image description here

У меня есть генератор python, который создает случайные черно-белые изображения и 2 уменьшенные матрицы. Верхняя и левая матрицы подаются как входные (левый транспонирован, чтобы соответствовать верхнему), а черно-белые как ожидаемый результат. Ввод трактуется как 3-мерный (128 * 64 * 2), где 2 - сверху и слева соответственно. Ниже приведена моя текущая топология, которая пытается построить функцию (128 * 64 * 2) -> (128, 128, 1)

Модель: «модель»


Layer (тип) Параметр формы вывода #



interlaced_reduce (InputLaye [(None, 128, 64, 2)] 0


small_conv (Conv2D) (None, 128, 64, 32) 288


leaky_re_lu (LeakyReLU) (Нет, 128, 64, 32) 0


medium_conv (Conv2D) (Нет, 128, 64, 64) 8256


leaky_re_lu_1 (LeakyReLU) (Нет, 128, 64, 64) 0


large_conv (Conv2D) (Нет, 128, 64, 128) 32896


leaky_re_lu_2 (LeakyReLU) (Нет, 128, 64, 128) 0


up_sampling2d (UpSampling2D) (Нет, 128, 128, 128) 0


выпадение (Dropout) (Нет, 128, 128, 128) 0


плотный (Плотный) (Нет, 128, 128, 1) 129



Всего параметров: 41569 Обучаемые параметры: 41569 Необучаемые параметры: 0


После тренировки на 50 изображениях I получил следующую статистику c (обратите внимание, я безуспешно пытался нормализовать входные матрицы до [0,1], текущая статистика c демонстрирует ненормализованный случай):

.. . Эпоха 50/50 2/2 [==============================] - 1 с 687 мс / шаг - потеря: 18427,2871 - mae: 124.9277

Тогда прогноз дает следующее:

enter image description here

Вы можете увидеть слева ожидаемое случайное изображение и справа - результат предсказания. В прогнозировании я намеренно использую изображение в оттенках серого, чтобы понять, насколько мой результат близок к целевому. Но, как видите, прогноз далек от ожидаемого и близок к исходной форме матриц сокращения сверху / слева. Итак, мои вопросы:

1) Какие слои мне не хватает?

2) Что нужно улучшить в существующей топологии?

ps это cross post от Cross Validated Stackexchange, потому что никто даже не просматривал вопрос об этом сайте

Ответы [ 2 ]

1 голос
/ 28 мая 2020

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

Попробуйте добавить полностью связанный скрытый слой

Из опубликованной вами модели кажется, что у вас есть несколько слоев свертки, за которыми следуют слой с повышением дискретизации и исключения, и, наконец, один плотный слой для ваших выходных узлов . Потенциально может помочь добавление дополнительных плотных слоев (например, 128 или более или менее узлов) перед окончательным выходным слоем. Хотя несколько слоев свертки помогают нейронной системе net выстраивать своего рода иерархическое понимание изображения, класс гипотез может быть недостаточно сложным. В этом может помочь добавление одного или нескольких плотных слоев.

Попробуйте использовать многослойный персептрон

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

Таким образом, одним из возможных вариантов было бы удалить слои свертки и использовать многослойный персептрон ( MLP ).

Давайте подумаем о входе как о двух матрицах чисел, а на выходе - как о матрице единиц и нулей, соответствующих «черному» и «белому». '. Затем вы можете попробовать модель со следующими слоями:

  1. Слой Flatten, который принимает две уменьшенные матрицы в качестве входных данных и выравнивает их

  2. Скрытый плотный слой, может быть, с чем-то вроде 128 узлов и активацией relu. Вам следует поэкспериментировать с количеством слоев, узлов и активацией.

  3. Выходной плотный слой с 16384 (128x128) узлами. К этому слою можно применить активацию softmax, которая может помочь оптимизатору в процессе обучения. Затем при создании окончательного изображения установите значения от <0,5 до 0 и значения> = 0,5 до 1, а затем измените форму и переформатируйте матрицу в квадратное изображение.

Конечно, нет никаких гарантий, что MLP будет работать хорошо, но если это часто происходит, особенно при наличии достаточного количества данных (возможно, в тысячах или более примеров обучения).

Попробуйте использовать детерминированный c алгоритм

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

1 голос
/ 27 мая 2020

Модель, которую вы создаете, является обычной моделью (видно при использовании Conv2D). Этот слой хорош для анализа чего-либо с учетом своих соседей. Делая их очень мощными для классификации или сегментации изображений.

В вашем случае результат пикселей зависит от всей строки и столбца.

Нейронные сети, похоже, не подходят для вашей проблемы, но Если вы хотите продолжить, попробуйте заменить сверточные слои на Conv (1xN) и Conv (Nx1). Все равно будет очень сложно заставить его работать.

Сложный путь: эти головоломки существуют в результате сильного повторяющегося процесса. На каждом шаге правильные места заполняются int нулем или единицей. Основываясь на них, заполняется следующая. Так что повторяющаяся нейронная сеть имеет для меня наибольший смысл. Если свертка используется для того, чтобы прогноз соседей влиял на его текущий прогноз

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