Читать книгу Нейросетевое программирование. Инструментарий нейрокомпьютинга - Александр Кириченко - Страница 4

Инструментарий нейрокомпьютинга
Технология создания скрипта

Оглавление

Большое значение для нейроконструктора имеет возможность автоматизировать процесс конструирования. В MemBrain для этого предусмотрена возможность использования скриптового языка. Скриптовый язык позволяет записывать в виде текста (стилизованных английских предложений) последовательность команд нейропакета. Эти же команды можно вводить вручную, используя главное меню пакета.

Например, при подготовке нейропакета к работе необходимо произвести его настройку, которая состоит из нескольких часто повторяющихся команд (рассмотрим содержимое файла «Decoder4To16_.as»):

// Отрегулируйте меню вид (view)

ViewSetting (BLACK_BG, true);

ViewSetting (SHOW_GRID, false);

ViewSetting (UPDATE_TEACH, true);

ViewSetting (UPDATE_THINK, true);

ViewSetting (SHOW_FIRE, false);

ViewSetting (SHOW_ACT_SPIKES, false);

ViewSetting (SHOW_LINKS, true);

/*Такая настройка предусматривает вывод на экран всех чертежей на чёрном фоне. Замена в первой строке true на false позволяет значительно повысить восприимчивость графики.

Во второй строке запрещается использовать в чертежах сетку.

В третьй и четвёртой строках разрешается использовать коррекцию в процессе обучения и исполнения нейросетей.

Следующие две строки запрещают использование таких конструкций, как FIRE и SPIKES.

Последняя строка разрешает высвечивать связи на чертежах. Результат такой настройки можно посмотреть в меню View:

*/


Рис.1 Настройки в меню View


//Открыть на экране нейросеть позволяет команда:

OpenNet («Decoder4To16.mbn»);

//в команде указывается название файла, в котором была сохранена нейросеть.


Рис.2 Нейросеть из файла «Decoder4To16.mbn»


//После того, как сеть будет прорисована на экране, необходимо произвести

//рандомизацию всех весов ссылок и порогов активации:

RandomizeNet (); // Или на графике:


Рис.3 Клавиша рандомизации нейросети


//

//Следующие команды продолжают подготовку нейропакета:

ResetThinkSteps (); // Сброс счетчика шагов (уроков), или в окне:


Рис.4 Сброс счетчика шагов (уроков)


//

SetLessonCount (1); // Установить количество уроков (1)

SetLessonCount (4); // в результате чего появится:


Рис.5 Установка «Number of Lessons»


// Здесь указано, что ожидается 4 урока

/*В данном примере предусмотрено 4 урока:

– training lesson (исходный обучающий урок) – исходные файлы mbn & training lesson. mbl

– validate lesson (исходный контролирующий урок) – исходный файл validate lesson. mbl

– активация выходных нейронов (реакция сети на тренировочные данные 1 к уроку №3) – вывод в файл TrainResult. csv

– результаты урока 2 на данные validate lesson (2 к уроку №3) – вывод в файл ValidateResult. csv

их адреса высвечиваются на экране после входа в Lesson Editor —> Lesson Files —> Урок №1. В скрипт – программе это записывается в виде крманды:

*/

SelectLesson (1); //начинается с меню Lesson Editor:


Рис.6 Загрузка урока 1


//

//Выполняется загрузка необходимых для работы данных, настройка учителя и обучение:

LoadLesson («Decoder4To16_Training. mbl»); // Загрузите обучающий урок

//Чтобы полностью просмотреть сеть (последней командой она была закрыта редактором уроков), уберите с экрана редактор урока, чтобы полностью стала видна сеть.

ShowLessonEditor (false);

//Установите учителя, который будет использоваться. Используйте имя учителя, который вы хотите установить в качестве активного.

SelectTeacher («RPROP»); // Используйте учителя с именем «RPROP»

//Настройте учителя (Adjust the teacher) – настройку можно произвести через окно //Teacher Manager:


Рис.7 Настройка учителя


//

//Или с помощью команл:

TeacherSetting (LEARNRATE, 0.1); // Скорость обучения

TeacherSetting (TARGET_ERR, 0.3); // Установка допустимой целевой ошибки

TeacherSetting (LESSON_REPS, 1); // Повторение урока за шаг обучения

TeacherSetting (PATTERN_REPS, 1); // Повторение паттернов за шаг обучения

//Определите метод выбора шаблона:

TeacherSetting (PATTERN_SELECT, RAND_ORDER);

SetTeachSpeed (0); // Установка максимальной скорости обучения

//и так далее

//Запустите просмотрщик ошибок

ShowErrorViewer (true);

//и уберите его с экрана

ResetErrorViewer ();

//Начните обучение и дождитесь остановки после достижения целевой ошибки

StartTeaching ();

SleepExec (); // Ожидание окончания обучения

//Снова скрыть средство просмотра ошибок

ShowErrorViewer (false);

//Сбросить счетчик шагов (уроков)

ResetThinkSteps ();


//Теперь подготовьте урок №3, чтобы записать результаты работы сети при выполнении урока №1.


//Сохраните значения активации выходных нейронов

SetRecordingType (RT_ACT);

//Включите запись данных на занятие №3

StartRecording (3);

//Скрыть редактор урока

ShowLessonEditor (false);

//Установка времени для записи целого урока во внутреннюю память MemBrainSetThinkSpeed (500); //500 мс между этапами обдумывания для анимации


//Запись реакции сети на тренировочные данные к уроку №3

ThinkLesson (); // Выполните каждый шаблон урока №1 (и запишите на №3)

SleepExec (); // Ожидание окончания выполнения урока

//Отключение записи после окончания урока (500 мс)

StopRecording ();

SelectLesson (2); // Загрузка урока №2 с данными для проверки

LoadLesson («Decoder4To16_Validate. mbl»);

//Этот урок только для ввода. Не нужны никакие выходные данные,

EnableLessonOutData (false);

//Запишите значения активации выходных нейронов

SetRecordingType (RT_ACT);


//Включить запись данных на урок №4

StartRecording (4);

ShowLessonEditor (false); // Скрыть редактор урока

ThinkLesson (); // Выполните каждый шаблон урока №2 (и запишите на №4)

SleepExec (); // Ожидание окончания обучения («Think on Lesson)

StopRecording (); // Отключить запись


//Теперь экспортируйте уроки №3 и 4 в CSV

SelectLesson (3);

ExportLessonRaw («Decoder4To16_TrainResult. csv»);

SelectLesson (4);

ExportLessonRaw («Decoder4To16_ValidateResult. csv»);


/*Раскомментируйте следующую строку, если вы хотите, чтобы MemBrain завершал работу после выполнения скрипта*/

// ExitMemBrain ();


/*Описанная здесь последовательность команд может быть представлена в виде скриптового файла с расширением. as – файла ("MemBrainScript1.as».


Для запуска скрипта в основном меню пакета набрать Scripting -> Execute Script:


Рис.8 Запуск скрипта


*/

В открывшемся окне выделить название скрипта:


Рис.9 Имя скрипта


После выполнения скрипта полученные результаты выведены на экран в том порядке, как они были указаны в скрипте:


Рис.10 Результат выполнения скрипта


Результатов много. Для их анализа необходимо рассмотреть содержание полученных файлов.

После загрузки сети первым вводился файл Decoder4To16_Training. mbl. Содержимое этого файла можно вывести из MemBrain в файл с расширением csv для дальнейшего просмотра на экране или для вывода на принтер. Номер выводимого из MemBrain файла нужно набрать клавишами Currently Edited (Training) Lesson. После этого активировать Raw CSV Files -> Export Current Lesson (Raw CSV…). В окне Export Lesson As (Raw CSV) … набрать имя создаваемого сsv файла и щёлкнуть по клавише «сохранить».

Необходимая для работы скрипта информация содержится в файлах:

Decoder4To16_Training. mbl

Decoder4To16_TrainResult. csv

Decoder4To16_Validate. mbl

Decoder4To16_ValidateResult. csv

Файлы с расширением mbl содержат двоичный код вводимых данных. Их ввод осуществляется через Lesson Editor:


Рис.11 Загрузка mbl-файла


Lesson Editor -> Lesson Files -> Load Current Lesson.

Скриптовый файл может не содержать пояснений – самое важное – это команды. Редкие пояснения даются в виде комментариев.

Для примера: скрипт таймера SecondsTimer.as

/* – — – — – — – — – — – — – — – — – — – — – — – — —

Этот пример демонстрирует, как функция сценария Now () может использоваться для поддержки произвольного числа таймеров с разрешением 1 с.

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

Затем создайте экземпляр класса «SecondsTimer’ для каждого необходимого вам таймера. Обратите внимание, что функции таймера содержат отладочный код, который печатает сообщения в окне трассировки MemBrain.

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

– — – — – — – — – — – — – — – — – — – — – — – — – —

*/


/* Глобальная переменная для подсчета экземпляров класса. Используется только для генерации отладочных сообщений.

AngelScript пока не поддерживает статические члены класса. Вот почему это должна быть глобальная переменная.

*/

uint gSecondsTimerInstanceCount = 0;


class SecondsTimer

{

// Constructor without arguments

SecondsTimer ()

{

mId = gSecondsTimerInstanceCount++;

mReferenceTime = Now ();

}


// Constructor with initial elapse time [s] (начальное время истечения)

SecondsTimer (uint seconds)

{

mId = gSecondsTimerInstanceCount++;

// Получить текущее время, добавить прошедшие секунды и сохранить полученное время.

int now = Now ();


mReferenceTime = now + seconds;


// Только для целей отладки:

/*

string timeStr;

TimeToString (now, timeStr);

Trace (timeStr);

TimeToString (mReferenceTime, timeStr);

Trace (» Timer " + mId + " started. Will elapse at:" + timeStr + "\n»);

строка timeStr;

TimeToString (now (сейчас), timeStr);

Trace (Трассировка) (timeStr);

TimeToString (mReferenceTime, timeStr);

Trace («Таймер» + mId + «запущен. Пройдет по адресу (закончится):" + timeStr + "\ n»);

*/

}


~SecondsTimer ()

{

gSecondsTimerInstanceCount – ;

}


// Проверяем, истек ли таймер

bool IsElapsed ()

{

int now = Now ();

bool elapsed = now> = mReferenceTime;

return elapsed;

}


// Запускаем таймер по истечении заданного времени

void Start (uint seconds)

{

// Получить текущее время, добавить прошедшие секунды и сохранить полученное время.

int now = Now ();

mReferenceTime = now + seconds;

}


// Запускаем таймер для подсчета секунд

void Start ()

{

// Получить текущее время, установить время истечения на то же значение.

int now = Now ();

mReferenceTime = now;

}


// Return the elapsed seconds since the timer was started

int SecondsSinceStart ()

{

// Получить текущее время

return Now () – mReferenceTime;

}


// Контрольное время для этого таймера

int mReferenceTime;

// ID таймера для этого таймера (необходим только для отладочных сообщений)

uint mId;

};

Нейросетевое программирование. Инструментарий нейрокомпьютинга

Подняться наверх