2014-02-13 6 views
1

Мне нужна помощь в сохранении моей нейронной сети.Сохранить тренированную нейронную сеть

Я объясню ... i запрограммировал многоуровневую сеть в C# .. часть приложения предназначена для обучения, а другая часть предназначена для тестирования нейронной сети. Все работает точно так, как должно. Когда я хочу тренировать свою сеть, я загружаю набор данных из файла. Когда обучение закончено, я тестирую его на меньшем образце данных, и это дает мне правильный результат. Но теперь я хотел бы иметь возможность тренировать свою сеть и сохранить, так что я могу загрузить его снова и использовать для дальнейшего тестирования.

+4

следует ли это действительно быть помечены сети? – DuncanACoulter

+1

Какие рамки для нейронных сетей вы используете? Это не стандартная функция C#/BCL. Если вы сами ее пишете, вам необходимо выполнить сериализацию и десериализацию сети. – Luaan

+8

Кажется немного странным, что вы знаете, как писать многослойную нейронную сеть на C#, но не имеют понятия о том, как сохранить ее состояние ... –

ответ

3

Предполагаю, что у вас есть класс обучения компьютеру под названием Bayes (или что-то еще). Как правило, вы бы отметить это как [Serializable]

using System.IO; 
[Serializable] 
public class NaiveBayes 
{ 
    ... 
} 

В этом классе вы могли бы иметь метод, чтобы сделать ваше сохранение

public void Save(Stream stream) 
{ 
    YourBinaryFormatter b = new YourBinaryFormatter(); 
    b.Serialize(stream, this); 
} 

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

3

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

Итак, как вы сохраняете текущее состояние любого типа данных?
1) Напишите тип, его состояние и возможный дескриптор 2) Прочтите.

Для целого int a = 3, вы можете записать файл со следующим содержимым:

integer 
a 
3 

нейронная сеть представляет собой абстрактный тип данных, как целое. Определяется топологией и конечными весами после обучения. Допустим, у вас есть MLP с в = 3, спрятался = 6, из = 2, то вы можете написать файл со следующим содержимым:

3-6-2 // topology 
test1 // name of neural network, could also be in filename (or timestamp) 
weight matrix [in->hid] 
weight matrix [hid->out] 

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

Если вы хотите восстановить свою сеть, просто проанализируйте записанный файл и используйте все, что вы прочитали, для инициализации сети, как и раньше, но теперь пропустите обучение. Вы должны иметь возможность записывать файлы на свой робот. Если вы не можете этого сделать, отправьте информацию через Wi-Fi на локальный компьютер и напишите там.

0

Вы можете проверить мою реализацию многоуровневой сети на C# here.

Вам необходимо сериализовать структуру сети, ее вес и предубеждения. Ann library имеет вспомогательные методы для этого:

Шаг 1.Определение конфигурации слоя:

var layerConfig = new LayerConfiguration() 
    .AddInputLayer(2) 
    .AddHiddenLayer(5) 
    .AddHiddenLayer(5) 
    .AddOutputLayer(1); 

Шаг 2. Поезд Модель:

model.TrainModel(new List<double> { 0.25, 0.50 }, new List<double> { 1 }); 
model.TrainModel(new List<double> { 0.75, 0.15 }, new List<double> { 0 }); 
model.TrainModel(new List<double> { 0.60, 0.40 }, new List<double> { 1 }); 
... 

Шаг 3. Сохранить подготовку модели к JSON файла:

model.SaveModelToJson("model.json"); 

Вы можете создать экземпляр нового объекта сети и использовать ранее подготовленная модель:

var model2 = new Network("model.json"); 
List<double> output = model2.UseModel(new List<double> { 0.35, 0.45 }); 
Смежные вопросы