Я пытаюсь запрограммировать свою собственную систему для запуска нейронной сети. Чтобы уменьшить количество необходимых узлов, было предложено сделать так, чтобы он обрабатывал повороты входа одинаково.
Моя сеть нацелена на изучение и прогнозирование игры жизни Конвея, рассматривая каждый квадрат и окружающие его квадраты в сетке, и давая выходные данные для этого квадрата. Его ввод - строка из 9 битов:
Выше представлен как 010 001 111.
Однако есть три других поворота этой формы, и все они производят одинаковый результат:
Моя топология сети состоит из 9 входных узлов и 1 выходного узла для следующего состояния центрального квадрата на входе. Как я могу построить скрытый слой (слои), чтобы они принимали каждое из этих вращений как одно и то же, сокращая количество возможных входных данных до четверти оригинала?
Редактировать:
Существует также переворот каждого поворота, который дает идентичный результат. Включение их сократит мой вклад на 1/8. С помощью планера моя цель состоит в том, чтобы все эти входы обрабатывались одинаково. Должно ли это быть сделано с предварительной обработкой или я могу включить ее в сеть?
источник
Ответы:
Если я правильно понимаю, ваш единственный выходной узел будет следующим статусом квадрата в середине. Вам не нужно беспокоиться о количестве узлов в скрытых слоях, пока у вас достаточно ресурсов для обучения модели. Эта проблема очень проста в изучении нейронной сети, поэтому размер не имеет значения.
Вам необходимо пройти обучение под наблюдением, что означает, что вам нужно вводить входные данные и соответствующие ожидаемые результаты. Вы должны быть уверены, что в ваших тренировочных данных все 4 вращения назначены на один и тот же выход. Таким образом, ваша сеть должна научиться относиться ко всем этим одинаково.
Вы сделали меня любопытным, поэтому я попробовал себя. Мое решение могло бы выучить 100% правильно примерно за 20 эпох, работающих за несколько секунд на моем старом ноутбуке. Я лишь незначительно изменил вывод на категориальный [0,1] или [1,0], но это дает тот же результат, который вы ищете. Просто для справки вот код, написанный на python:
источник
Вы определили оптимизацию в своем проблемном пространстве и хотите внедрить ее в свою нейронную сеть. Я предлагаю предварительную обработку: составьте свою оптимизацию с нейронной сетью, которая делает подмножество того, что вы хотите.
Другими словами, нормализуйте ваш ввод, вручную кодируя алгоритм поворота, который вращает входы, чтобы получить эквивалентность, выделенную в вашем посте. Затем перенаправьте результаты этого преобразования в свою нейронную сеть для обучения и других целей. Это означает, что вы тренируете нейронную сеть для решения подзадачи, которую вы определили - ротации избыточны.
Проверьте свой нормализатор, сгенерировав случайный вход, повернув его ко всем четырем потенциальным преобразованиям, запустите нормализатор для каждого и убедитесь, что все они эквивалентны.
источник
Чтобы быть чистым в этом, начните с рассмотрения входных данных по-другому, в виде кругового массива размера четыре, каждый элемент содержит пару битов и дополнительно центральный бит:
На протяжении всей конструкции сети продолжайте эту круговую структуру и центральную точку парадигмы.
источник