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

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

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

Структура регистра сведений

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

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

Нейросеть в регистре сведений

Теперь доработаем нашу обработку, в которой мы рассчитывали результат работы нейросети.

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

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

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

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

Сохраним конфигурацию и посмотрим на работу нашей сети. В этом примере сеть определяла курицу.

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

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

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

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

Если же хотите более глубже и основательно изучить программирование в 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 не будет опубликован. Обязательные поля помечены *

3 × один =