Читать книгу Нейросетевое программирование. Инструментарий нейрокомпьютинга - Александр Кириченко - Страница 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;
};