Конфигурация в 1С 8.3 «Однослойная линейная нейронная сеть»

В предыдущих статьях, я Вам рассказал, что такое линейный нейрон, и как реализовать его в самом простом варианте в среде разработки 1С 8.3, а также, я показал, как реализовать однослойную линейную нейросеть.

В этой статье, мы реализуем конфигурацию 1С, где будет функционировать однослойная линейная нейронная сеть.   Эта та же самая нейронная сеть, где мы выявляли принадлежность к тому или иному классу животных (звери, рыбы и птицы), которую я сделал в предыдущей статье «Нейронные сети в среде 1С 8.3. Однослойная линейная сеть» в обработке. Но если сеть в обработке была статична, т.е. мы не могли ее переделать без правки кода, то сеть в конфигурации можно будет изменять без правки кода: добавлять нейроны  и добавлять веса в нейроны.

Расскажу суть работы этой конфигурации: в  экземпляре справочника «Однослойная линейная сеть» в табличной части будут перечислены нейроны, которые входят в эту сеть. Каждый нейрон это отдельный экземпляр справочника «Нейроны», в котором перечислены веса всех входов, которые есть у нейрона. Для удобства, все возможные варианты входов нейрона будут собраны во вспомогательном справочнике «Виды входов нейрона».  Обсчитывать работу нейронной сети будем в специальной обработке, в этой обработке оператор выберет нужную нейронную сеть, введет входные данные и получит результат. Я не делаю различные «защиты от дурака», предполагается, что в одной нейронной сети будут нейроны с одинаковым набором вариантов входов.

У этой конфигурации будет следующая структура:

  • Основа конфигурации — отдельный справочник «Нейрон», у которого имеется единственная табличная часть «Веса нейрона», в этой табличной части будут перечислены веса всех входов нейрона и их коэффициенты.
  • Второй справочник «Однослойная линейная сеть» с единственной табличной частью «Нейроны», в этой табличной части будут перечислены нейроны, входящие в эту сеть.
  • Вспомогательный справочник «Виды входов нейрона» для удобства работы с нейроном все варианты входов будем хранить в этом справочнике. Соответственно в табличной части «Веса нейрона» справочника «Нейрон» будет ссылка на этот справочник.

Структура справочников представлена ниже:

Структура конфигурации Однослойная линейная нейросеть в 1С 8.3

Этих трех справочников вполне хватит.

Сохраним конфигурацию, зайдем в  «1С: Предприятие» и заполним справочники.

Первым делом заполним вспомогательный справочник «Виды входов нейрона», это будут такие же варианты входов, как и в обработке предыдущей статьи.

Справочник Виды входов нейрона в 1С 8.3

Создадим три нейрона «Звери», «Птицы» и «Рыбы», в которых перечислим варианты входов и проставим коэффициенты для них (как учить нейроны, узнаем в одной из следующих статей).

Нейрон в конфигурации в 1С 8.3

Нейрон в конфигурации в 1С 8.3

Нейрон в конфигурации в 1С 8.3

Создадим экземпляр справочника «Однослойная линейная сеть», где в табличной части перечислим все ранее созданные нейроны.

Однослойная линейная сеть в 1С 8.3

Непосредственно саму конфигурацию мы сделали, и создали нужную нейронную сеть в базе, теперь создадим  обработку, в которой будем осуществлять работу этой сети.  В обработке будет управляемая форма, на которой создадим следующие реквизиты: «Однослойная сеть» (ссылка на справочник «Однослойная линейная сеть»), «Входные сигналы» (таблица значений с колонками «Вид входного сигнала» и «Входной сигнал) и «Выходные сигнал» (таблица значений с колонками «Нейрон» и «Выходной сигнал).  А так же создадим команду «Расчет». Все эти реквизиты разместим на форме в виде элементов формы.

Реквизиты формы для работы нейронной сети в 1С 8.3

Для элемента формы «Однослойная сеть», связанного с соответствующим реквизитом, создадим обработчик для события «При изменении» (см. рис. ниже). При работе этого обработчика, будет заполняться таблица значений формы «Входные сигналы».  В эту таблицу значений запишем все входные сигналы одного из нейронов  нашей сети, т.к. предполагаем, что у всех нейронов одинаковый набор входных сигналов (см. листинг ниже).

Создать обработчик  события  ПриИзменении элемента формы

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

&НаСервере
Процедура ОднослойнаяСетьПриИзмененииНаСервере()
   
//очищаем все таблицы значений
   
ВходныеСигналы.Очистить();
   
ВыходныеСигналы.Очистить();
   
//в запросе во временную таблицу записываем первый нейрон,
    //выбранной нейросети
    //а потом получаем все входы данного нейрона
   
Запрос = Новый Запрос;
   
Запрос.Текст = «ВЫБРАТЬ ПЕРВЫЕ 1
                   |    ОднослойнаяНейроннаяСетьНейроны.Нейрон КАК Нейрон
                   |ПОМЕСТИТЬ втНейрон
                   |ИЗ
                   |    Справочник.ОднослойнаяНейроннаяСеть.Нейроны КАК ОднослойнаяНейроннаяСетьНейроны
                   |ГДЕ
                   |    ОднослойнаяНейроннаяСетьНейроны.Ссылка = &НейроСеть
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Нейрон
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    НейронВесаНейрона.ВидВхода КАК ВидВходногоСигнала,
                   |    0 КАК ВходнойСигнал
                   |ИЗ
                   |    Справочник.Нейрон.ВесаНейрона КАК НейронВесаНейрона
                   |ГДЕ
                   |    НейронВесаНейрона.Ссылка В
                   |            (ВЫБРАТЬ
                   |                вт.Нейрон
                   |            ИЗ
                   |                втНейрон КАК вт)»
;
   
Запрос.УстановитьПараметр(«НейроСеть»,ОднослойнаяСеть);
   
Выборка = Запрос.Выполнить().Выбрать();
    Пока
Выборка.Следующий() Цикл
       
НовСтр = ВходныеСигналы.Добавить();
       
ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
    КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОднослойнаяСетьПриИзменении(Элемент)
   
ОднослойнаяСетьПриИзмененииНаСервере();
КонецПроцедуры

Посмотрим, как отработает данный код, выбрав в обработке уже созданную нейронную сеть.

Входы нейронной сети в 1С 8.3

Теперь нам осталось создать код, в котором мы будем рассчитывать указанную в обработке нейронную сеть. Для этого создадим обработчики команды «Расчет» на сервере и на клиенте.

В серверном обработчике напишем следующий код:  выгрузим в таблицу значений данные входных сигналов, выполним запрос, в котором посчитаем выходные сигналы, и результат запроса загрузим в таблицу выходных сигналов (см. листинг).

&НаСервере
Процедура РасчетНаСервере()
   
ТЗВходныеСигналы = ВходныеСигналы.Выгрузить(,«ВидВходногоСигнала,ВходнойСигнал»);
   
//передадим в запрос таблицу значений входных сигналов,
    //поместим ее в во временную таблицу
    //в другую временную таблицы поместим все нейроны указанной сети
    //в конечном запросе получим веса всех нейронов,
    //которые есть в сети и умножим их на данные входных сигналов
    //для этого свяжем таблицу весов нейронов со временной таблицей
    //входных сигналов по полю вид входного сигнала (внутреннее соединение)
    //сгруппируем все входные сигналы для нейрона,
    //чтобы получить выходной сигнал для каждого нейрона сети
   
Запрос = Новый Запрос;
   
Запрос.Текст = «ВЫБРАТЬ
                   |    ТЗВходныхСигналов.ВходнойСигнал КАК ВходнойСигнал,
                   |    ТЗВходныхСигналов.ВидВходногоСигнала КАК ВидВходногоСигнала
                   |ПОМЕСТИТЬ втВходныхСигналов
                   |ИЗ
                   |    &ТЗВходныхСигналов КАК ТЗВходныхСигналов
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    ВидВходногоСигнала
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ОднослойнаяНейроннаяСетьНейроны.Нейрон КАК Нейрон
                   |ПОМЕСТИТЬ втНейроны
                   |ИЗ
                   |    Справочник.ОднослойнаяНейроннаяСеть.Нейроны КАК ОднослойнаяНейроннаяСетьНейроны
                   |ГДЕ
                   |    ОднослойнаяНейроннаяСетьНейроны.Ссылка = &НейроСеть
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Нейрон
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    НейронВесаНейрона.Ссылка КАК Нейрон,
                   |    СУММА(НейронВесаНейрона.ЗначениеВеса * втВходныхСигналов.ВходнойСигнал) КАК ВыходнойСигнал
                   |ИЗ
                   |    Справочник.Нейрон.ВесаНейрона КАК НейронВесаНейрона
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втВходныхСигналов КАК втВходныхСигналов
                   |        ПО НейронВесаНейрона.ВидВхода = втВходныхСигналов.ВидВходногоСигнала
                   |ГДЕ
                   |    НейронВесаНейрона.Ссылка В
                   |            (ВЫБРАТЬ
                   |                вт.Нейрон
                   |            ИЗ
                   |                втНейроны КАК вт)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    НейронВесаНейрона.Ссылка»
;
   
Запрос.УстановитьПараметр(«ТЗВходныхСигналов»,ТЗВходныеСигналы);
   
Запрос.УстановитьПараметр(«НейроСеть»,ОднослойнаяСеть);
   
ВыходыСети = Запрос.Выполнить().Выгрузить();
   
ВыходныеСигналы.Загрузить(ВыходыСети);
КонецПроцедуры
&НаКлиенте
Процедура Расчет(Команда)
   
РасчетНаСервере();
КонецПроцедуры

Сохраним конфигурацию и посмотрим на работу нашей сети.

 Работа однослойной нейронной сети в 1С 8.3

Попробуйте поработать с этой сетью, добавить новые нейроны (например, земноводные), добавить новые виды входов (например, имеет зубы) и т.п.

Нейронная сеть с конкуренцией

Мы получили просто результат работы сети, но сеть на не сказала, какой результат правильный.  Доработаем механизм расчета нашей нейронную сеть:  на форме обработки создадим реквизит «Порог решения», и если у нескольких нейронов будут результаты выше этого порога, то из этих результатов мы выберем максимальный (выделим его в таблице в зеленый цвет), а иначе ни чего выделять не будем, это значит, что сеть не нашла решений.

Для этого доработаем форму обработки: создадим новую колонку Победитель (тип Булево) для таблицы значений Выходные сигналы, а также реквизит Порог победителя (тип Число).  И все  этот разместим на форме.

Новые реквизиты  формы 1С для нейронной сети с конкуренцией

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

Условное оформление  управляемой формы 1C 8.3

При открытии формы реквизиту Порог победителя будем присваивать значение 5

&НаКлиенте
Процедура ПриОткрытии(Отказ)
   
ПорогПобедителя = 5;
КонецПроцедуры

Нам осталось доработать расчет нашей нейронной сети.

&НаСервере
Процедура РасчетНаСервере()
   
ТЗВходныеСигналы = ВходныеСигналы.Выгрузить(,«ВидВходногоСигнала,ВходнойСигнал»);
   
//передадим в запрос таблицу значений входных сигналов,
    //поместим ее в во временную таблицу
    //в другую временную таблицы поместим все нейроны указанной сети
    //в конечном запросе получим веса всех нейронов,
    //которые есть в сети и умножим их на данные входных сигналов
    //для этого свяжем таблицу весов нейронов со временной таблицей
    //входных сигналов по полю вид входного сигнала (внутреннее соединение)
    //сгруппируем все входные сигналы для нейрона,
    //чтобы получить выходной сигнал для каждого нейрона сети
    //
    //определяем нейрон победитель: конечный результат помещаем во временную таблицу
    //эту таблицу используем для нейрона с максимальным выходом из тех,
    //что выше порога с победителем,
    //этот результат также будет помещен во временную таблицу
    //В конечном запросе левым соединением связываем временную таблицу
    //с результатом и таблицу с нейроном победителем
    //В отдельном поле проверям связались ли таблицы,
    //если да, то в поле будет Истина, а иначе Ложь
   
Запрос = Новый Запрос;
   
Запрос.Текст = «ВЫБРАТЬ
                   |    ТЗВходныхСигналов.ВходнойСигнал КАК ВходнойСигнал,
                   |    ТЗВходныхСигналов.ВидВходногоСигнала КАК ВидВходногоСигнала
                   |ПОМЕСТИТЬ втВходныхСигналов
                   |ИЗ
                   |    &ТЗВходныхСигналов КАК ТЗВходныхСигналов
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    ВидВходногоСигнала
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ОднослойнаяНейроннаяСетьНейроны.Нейрон КАК Нейрон
                   |ПОМЕСТИТЬ втНейроны
                   |ИЗ
                   |    Справочник.ОднослойнаяНейроннаяСеть.Нейроны КАК ОднослойнаяНейроннаяСетьНейроны
                   |ГДЕ
                   |    ОднослойнаяНейроннаяСетьНейроны.Ссылка = &НейроСеть
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Нейрон
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    НейронВесаНейрона.Ссылка КАК Нейрон,
                   |    СУММА(НейронВесаНейрона.ЗначениеВеса * втВходныхСигналов.ВходнойСигнал) КАК ВыходнойСигнал
                   |ПОМЕСТИТЬ втРезультатНейронов
                   |ИЗ
                   |    Справочник.Нейрон.ВесаНейрона КАК НейронВесаНейрона
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втВходныхСигналов КАК втВходныхСигналов
                   |        ПО НейронВесаНейрона.ВидВхода = втВходныхСигналов.ВидВходногоСигнала
                   |ГДЕ
                   |    НейронВесаНейрона.Ссылка В
                   |            (ВЫБРАТЬ
                   |                вт.Нейрон
                   |            ИЗ
                   |                втНейроны КАК вт)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    НейронВесаНейрона.Ссылка
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Нейрон
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ ПЕРВЫЕ 1
                   |    втРезультатНейронов.Нейрон КАК Нейрон,
                   |    втРезультатНейронов.ВыходнойСигнал КАК ВыходнойСигнал
                   |ПОМЕСТИТЬ втНейронПобедитель
                   |ИЗ
                   |    втРезультатНейронов КАК втРезультатНейронов
                   |ГДЕ
                   |    втРезультатНейронов.ВыходнойСигнал > &ПорогПобедителя
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ВыходнойСигнал УБЫВ
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    втРезультатНейронов.Нейрон КАК Нейрон,
                   |    втРезультатНейронов.ВыходнойСигнал КАК ВыходнойСигнал,
                   |    ВЫБОР
                   |        КОГДА втНейронПобедитель.ВыходнойСигнал ЕСТЬ NULL
                   |            ТОГДА ЛОЖЬ
                   |        ИНАЧЕ ИСТИНА
                   |    КОНЕЦ КАК Победитель
                   |ИЗ
                   |    втРезультатНейронов КАК втРезультатНейронов
                   |        ЛЕВОЕ СОЕДИНЕНИЕ втНейронПобедитель КАК втНейронПобедитель
                   |        ПО втРезультатНейронов.Нейрон = втНейронПобедитель.Нейрон»
;
   
Запрос.УстановитьПараметр(«ТЗВходныхСигналов»,ТЗВходныеСигналы);
   
Запрос.УстановитьПараметр(«НейроСеть»,ОднослойнаяСеть);
   
Запрос.УстановитьПараметр(«ПорогПобедителя»,ПорогПобедителя);
   
ВыходыСети = Запрос.Выполнить().Выгрузить();
   
ВыходныеСигналы.Загрузить(ВыходыСети);
КонецПроцедуры

И посмотреть, как работает наша сеть с конкуренцией.

Работа нейронной сети с конкуренцией 1C 8.3

Многослойная нейронная сеть в среде 1С 8.3

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

Ждете новых статей по нейронным сетям в среде разработке 1С? Поддержите проект!

Конфигурация в 1С 8.3 «Однослойная линейная нейронная сеть». Версия 2 (с использованием регистра сведений)

 

Если же хотите более глубже и основательно изучить программирование в 1С, то я рекомендую Вам свои книги:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

три × 4 =