Манипуляция с нейронами PyBrain

Есть ли хороший способ добавить / удалить нейрон и связанные с ним соединения в / из полностью подключенной сети PyBrain? Скажем, я начинаю с:

from pybrain.tools.shortcuts import buildNetwork
net = buildNetwork(2,3,1)

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

редактировать: я нашел NeuronDecomposableNetwork, который должен сделать это проще, но все равно кажется, что я должен отслеживать нейроны и соединения отдельно.

1 ответ

Решение

Я предполагаю, что вы делаете в соответствии с алгоритмом NEAT? Есть два разных ответа на ваш вопрос:

  1. Открытая эволюция топологии сети: в этом случае я рекомендую инкапсулировать каждый нейрон в свой собственный "слой"/ модуль и добавлять и удалять их и их подключения к сети итеративно, как в этом уроке, за исключением того, что быть много больше (однонейронных) слоев. Не забудьте позвонить sortModules() метод после каждого топологического изменения.

  2. Нахождение наилучшей топологии в заранее определенной структуре (скажем, максимум 1000 нейронов). В этом случае проще и эффективнее построить полную сеть в начале и просто замаскировать некоторые соединения (например, используя MaskedParameters модуль). Среди прочего, меметические алгоритмы (используемые таким образом) предназначены для поиска в таких топологических пространствах.

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


Общий комментарий: для более продвинутого использования pybrain, такого как ваш, использование ярлыка `buildNetwork'на самом деле слишком ограничено, и вы захотите напрямую использовать Network/Module/Connection API.

Другие вопросы по тегам