Манипуляция с нейронами PyBrain
Есть ли хороший способ добавить / удалить нейрон и связанные с ним соединения в / из полностью подключенной сети PyBrain? Скажем, я начинаю с:
from pybrain.tools.shortcuts import buildNetwork
net = buildNetwork(2,3,1)
Как мне сделать так, чтобы это была (2,4,1) или (2,2,1) сеть, поддерживая все старые веса (и инициализируя любые новые веса случайными, как это делается при инициализации сети)? Причина, по которой я хочу это сделать, заключается в том, что я пытаюсь использовать стратегию эволюционного обучения для определения наилучшей архитектуры, а этап "мутации" включает в себя добавление / удаление узлов с некоторой вероятностью. (Модули ввода и вывода всегда должны оставаться неизменными.)
редактировать: я нашел NeuronDecomposableNetwork, который должен сделать это проще, но все равно кажется, что я должен отслеживать нейроны и соединения отдельно.
1 ответ
Я предполагаю, что вы делаете в соответствии с алгоритмом NEAT? Есть два разных ответа на ваш вопрос:
Открытая эволюция топологии сети: в этом случае я рекомендую инкапсулировать каждый нейрон в свой собственный "слой"/ модуль и добавлять и удалять их и их подключения к сети итеративно, как в этом уроке, за исключением того, что быть много больше (однонейронных) слоев. Не забудьте позвонить
sortModules()
метод после каждого топологического изменения.Нахождение наилучшей топологии в заранее определенной структуре (скажем, максимум 1000 нейронов). В этом случае проще и эффективнее построить полную сеть в начале и просто замаскировать некоторые соединения (например, используя
MaskedParameters
модуль). Среди прочего, меметические алгоритмы (используемые таким образом) предназначены для поиска в таких топологических пространствах.
Альтернативой, как вы говорите, является ручное управление всеми весами (отслеживая, что находится где, или используя NeuronDecomposableNetwork
) но я не рекомендую это.
Общий комментарий: для более продвинутого использования pybrain, такого как ваш, использование ярлыка `buildNetwork'на самом деле слишком ограничено, и вы захотите напрямую использовать Network/Module/Connection API.