Написал скрипт, используя библиотеку для обучения генетическим алгоритмом
genetic.js
(Эта библиотека написана в свою очередь для библиотеки
synaptic)
Для нейросети из synaptic поддерживается функция записи в JSON:
Network.toJSON()
И функция построения из JSON-объекта:
synaptic.Network.fromJSON(JSONObject)
С помощью этих функций я пытаюсь сохранить обученную сеть, на случай отключения интернета (обучающие данные берутся из сети), чтобы потом продолжить с того места, на котором оборвалось обучение
Сохранение в файл идет для целой популяции генетического алгоритма. То есть, имеется объект
GA = new GeneticAlgorithm(max_units, winers_count)
, интерфейс генетичекого алгоритма. У него массив из нейросетей - популяция
Сохранение в файл идет таким образом:
var pop = [];
for (var i = 0; i < GA.Population.length; i++) {
pop.push(GA.Population[i].toJSON());
}
fs.writeFileSync('./population.json', JSON.stringify(pop));
console.log("saved");
Если же начинаю новое обучение после остановки старого, заполняю популяцию таким образом:
if (fs.existsSync('./population.json')){
var d = fs.readFileSync('./population.json', 'utf8');
var pop = JSON.parse(d);
for (var i = 0; i < pop.length; i++) {
var unit = synaptic.Network.fromJSON(pop[i]);
unit.index = i;
unit.fitness = 0;
unit.score = 0;
unit.isWinner = false;
GA.Population[i] = unit;
console.log('unit has been read');
}
}
Score(GA)
Вроде все логично, все сохраняется
Решил протестировать
Генетический алгоритм достаточно прилично натренировывает популяцию, движение к желаемому результату просматривается отменно
Закрываю программу на большом поколении, после того, как сохранил популяцию
Запускаю заново - вроде из файла читается, пишет
unit has been read
, но результат активации нейросети - будто бы не обучалась
Проблема именно с сохранением или чтением
Не с преобразованием и не из-за того, что данные сильно отличаются
Потому что тестировал обучение так же на абсолютно одинаковых данных, которые популяция должна хорошо запомнить уже на 5-7 поколении. Однако - новое обучение, с чтением из сохраненного, - и все равно, будто и не обучалась
То есть, эта проблема не из-за того, что поступают слишком разные данные, и что после возобновления обучения поступают данные, с которыми сеть плохо среагирует
Что может быть не так?
P.S. Сам генетический алгоритм реализован на комбинировании и мутации
уже преобразованных в JSON нейросетей, и в популяцию добавляется нейросеть,
преобразованная обратно из JSON-а. То есть с самим преобразованием проблем не должно быть.