Как я могу заставить мою сеть одинаково относиться к поворотам входа?


11

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

Моя сеть нацелена на изучение и прогнозирование игры жизни Конвея, рассматривая каждый квадрат и окружающие его квадраты в сетке, и давая выходные данные для этого квадрата. Его ввод - строка из 9 битов:

Планер

Выше представлен как 010 001 111.

Однако есть три других поворота этой формы, и все они производят одинаковый результат:

Вращение планера

Моя топология сети состоит из 9 входных узлов и 1 выходного узла для следующего состояния центрального квадрата на входе. Как я могу построить скрытый слой (слои), чтобы они принимали каждое из этих вращений как одно и то же, сокращая количество возможных входных данных до четверти оригинала?

Редактировать:

Существует также переворот каждого поворота, который дает идентичный результат. Включение их сократит мой вклад на 1/8. С помощью планера моя цель состоит в том, чтобы все эти входы обрабатывались одинаково. Должно ли это быть сделано с предварительной обработкой или я могу включить ее в сеть?


Нерешенный вопрос! У меня похожая проблема с моим собственным проектом, и мне будет очень интересно узнать о наиболее эффективных методах уменьшения симметрии.
DukeZhou

@ DukeZhou У меня сложилось впечатление, что, чтобы получить ответ, потребуется некоторое время. Я готов использовать свой скудный запас репутации создать щедроты , если это необходимо ...
Арик

Другое решение заключается в предварительной обработке ввода, так что все 4 поворота перед подачей в сеть преобразуются в одно и то же изображение.
BlueMoon93

Ответы:


4

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

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

Вы сделали меня любопытным, поэтому я попробовал себя. Мое решение могло бы выучить 100% правильно примерно за 20 эпох, работающих за несколько секунд на моем старом ноутбуке. Я лишь незначительно изменил вывод на категориальный [0,1] или [1,0], но это дает тот же результат, который вы ищете. Просто для справки вот код, написанный на python:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)

Сеть, которую я буду использовать, будет смоделирована классом, написанным мной самим, поэтому проблемы с памятью.
Арик

Если вы хотите уменьшить использование памяти сетью, то уменьшение количества возможных входов (вращением) поможет создать меньшую сеть. Чем проще задача обучения, тем меньше требуется сеть. В этом случае предварительная обработка будет лучше. Тем не менее, NN для изучения концепции и изучения концепции игры жизни, которую вы должны кормить во всех моделях. Если ваша цель состоит в том, чтобы свести к минимуму объем памяти, решите проблему линейным способом.
Manngo

Если память не имеет значения, я бы предпочел, чтобы сеть выполняла эту операцию по тем же причинам, что и вы. Предварительная обработка удаляет некоторые задачи из сети, упрощая ее.
Арик

Исправьте, затем перейдите к предварительной обработке. Я думаю, что с этим ответ на вопрос. Вы можете решить реализовать это, если у вас возникнут проблемы с памятью. Совет: используйте float для весов, которые занимают только 32 бита вместо двойного, который занимает 64. Это будет использовать меньше памяти.
Manngo

4

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

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

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


1

Чтобы быть чистым в этом, начните с рассмотрения входных данных по-другому, в виде кругового массива размера четыре, каждый элемент содержит пару битов и дополнительно центральный бит:

... 01, 01, 11, 10 ...

0

На протяжении всей конструкции сети продолжайте эту круговую структуру и центральную точку парадигмы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.