[Модификация] Нейроуправление выключателем

Модераторы: Bagir, Ivan, Vit, immortal, PAV, newz20

C_3AXAPOB
Сообщения: 455
Зарегистрирован: Ср июн 08, 2016 4:17 pm
Благодарил (а): 104 раза
Поблагодарили: 87 раз

[Модификация] Нейроуправление выключателем

Сообщение C_3AXAPOB » Вт май 29, 2018 11:24 pm

**Дисклеймер!
Использование нейросети обученной на реальных* данных для управления объектом
Зачем? Потому что так интереснее!
За основу заметки взята статья nick с ресурса https://phpnick.ru/posts/category/php/48
*Так как мой сервер в процессе переезда я немогу протестировать на реальных данных
и в примере цифры поставлены для наглядности.
Я не являюсь ни специалистом в области ИИ ни программистом.
Всё протестировано и работает на ubuntu 18.04
**


Данные использованные для обучения нейросети - история объектов:
1.Информация о времени суток (можно обойтись и без неё но я оставил)
2.Датчика влажности
3.Состояния реле кухонной вытяжки

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

Для начала установим FANN (Fast Artificial Neural Network) в систему
1.В первую очередь нужно установить библиотеку libfann, если она не установлена.
sudo apt install libfann-dev
2.Затем нужно установить php-pear и php-dev той же командой (apt install).
3.Cамо расширение FANN для PHP:
sudo pecl install fann
4.Добавим в файл php.ini
extension=fann.so

Создадим файл данных для обучения нейросети поместив туда данные из истории наших объектов.
В первой строке 10 – это количество строк входных данных. Далее, 2 – это число входных данных (время суток, влажность); 1 – это число выходных данных(состояние реле), нейронная сеть должна выдавать -1 или 1 и на основании этого включать или выключать реле.


Содержание файла switchfan.data

Код: Выделить всё

10 2 1
-1 49
-1
-1 49
-1
-1 49
-1
-1 50
1
-1 50
1
-1 50
1
-1 50
1
-1 49
-1
-1 49
-1
-1 49
-1
Создадим php-файл, в котором обучим нейронную сеть решать нашу задачу. Код в этом файле должен быть следующим:

Код: Выделить всё

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 130;
$desired_error = 0.0001;
$max_epochs = 100000;
$epochs_between_reports = 1000;

$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_training_algorithm($ann, FANN_TRAIN_QUICKPROP);

    $filename = dirname(__FILE__) . "/switchfan.data";
    if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error))
        fann_save($ann, dirname(__FILE__) . "/switchfan.net");

    fann_destroy($ann);
}
?>
Параметры $num_neurons_hidden и $max_epochs подбираются экспериментальным путем но я оставил те которые были в статье nick'a

Создаём еще один php-файл для проверки того, как обученная нейронная сеть решает нашу задачу. Код в этом файле должен быть следующим:

Код: Выделить всё

<?php
$sea_file = (dirname(__FILE__) . "/switchfan.net");
if (!is_file($sea_file))
    die("Файл неросети не был создан! Перезапустите главный файл, чтобы его создать");

$ann = fann_create_from_file($sea_file);
if (!$ann)
    die("Нейросеть не была создана");

$input = array(-1, 50); //тестовые данные: день, влажность 50 процентов
$calc_out = fann_run($ann, $input);
echo "С параметрами помещения:<br>";
echo ($input[0] != 1) ? 'День<br>' : 'Ночь<br>';
printf("Влажность (%.2f)<br>", $input[1]);

if (round($calc_out[0]) == 1)
	printf("Надо включить вытяжку (%.2f).", $calc_out[0]);
else
	printf("Вытяжку включать не надо (%.2f).", $calc_out[0]);

fann_destroy($ann);
?>
Запускаем!

Входные данные: день, влажность 50 процентов
Решение:
С параметрами помещения:
День
Влажность (50.00)
Надо включить вытяжку (0.99).
Еще раз, день, влажность 30 процентов
Решение:
С параметрами помещения:
День
Влажность (30.00)
Вытяжку включать не надо (-1.00).
Ну и еще разок, день, влажность 60 процентов
С параметрами помещения:
День
Влажность (60.00)
Надо включить вытяжку (0.88).
Ссылка на архив с примером https://yadi.sk/d/AQONSDrP3Wg7FC
За это сообщение автора C_3AXAPOB поблагодарили (всего 5):
tarasfrompir1 (Ср май 30, 2018 6:31 am) • olehs (Ср май 30, 2018 11:44 am) • Denis_k (Ср май 30, 2018 11:16 pm) • lanket (Чт май 31, 2018 5:35 pm) • directman66 (Пт июн 01, 2018 5:55 am)
Рейтинг: 7.14%
Аватара пользователя
webms
Сообщения: 311
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 104 раза
Поблагодарили: 67 раз

Re: Нейроуправление выключателем

Сообщение webms » Ср май 30, 2018 9:25 am

нифига не понял)
а зачем такие сложности если можно вкл и выкл вытяжку просто условием if
Аватара пользователя
xor
Сообщения: 716
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 42 раза
Поблагодарили: 177 раз

Re: Нейроуправление выключателем

Сообщение xor » Ср май 30, 2018 9:57 am

Ну, это просто пример.
Интересен был бы модуль сбора обучающих данных для сети, типа пользователь выбирает свойства объектов системы:
день недели, время, сработка датчиков движения, включ/выкл света пользователем -- спустя некоторое время нейросеть будет иметь данные для частых маршрутов по помещению для вкл света и тп
C_3AXAPOB
Сообщения: 455
Зарегистрирован: Ср июн 08, 2016 4:17 pm
Благодарил (а): 104 раза
Поблагодарили: 87 раз

Re: Нейроуправление выключателем

Сообщение C_3AXAPOB » Ср май 30, 2018 10:06 am

webms писал(а):
Ср май 30, 2018 9:25 am
нифига не понял)
а зачем такие сложности если можно вкл и выкл вытяжку просто условием if
Можно. Но так интереснее. В данном случае можно дом не программировать а учить, т.е. он наблюдает за вами, видит
когда была включена вытяжка и при каких условиях и при повторении условий уже сам включит вытяжку.
За это сообщение автора C_3AXAPOB поблагодарил:
webms (Ср май 30, 2018 10:16 am)
Рейтинг: 1.43%
tarasfrompir1
Сообщения: 1215
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 70 раз
Поблагодарили: 173 раза

Re: Нейроуправление выключателем

Сообщение tarasfrompir1 » Ср май 30, 2018 10:26 am

webms писал(а):
Ср май 30, 2018 9:25 am
нифига не понял)
а зачем такие сложности если можно вкл и выкл вытяжку просто условием if
Да все даже очень правильно - как по мне это перспективное направление...
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
lanket
Сообщения: 1088
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 235 раз
Поблагодарили: 147 раз
Контактная информация:

Re: Нейроуправление выключателем

Сообщение lanket » Чт май 31, 2018 5:40 pm

Очень даже интересное направление. Понятно что управление вытяжкой в зависимости от день-ночь и процент влажности можно сделать простыми ифами. Но по сути мне кажется можно решить задачу точно определением что дома кто то есть , или определение наличие кого-либо в проходных помещениях. Или ещё интереснее имитация присутствия.

На самом деле я бы взялся но надо сначала довести до конца голосового ассистента. Если до этого времени никто не возьмется то думаю я подключусь запятая по сути не так сложно сделать как мне кажется.

Отправлено с моего Redmi Note 4 через Tapatalk

Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: GitHub терминала
:arrow: GitHub модуля для МД
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
Аватара пользователя
lanket
Сообщения: 1088
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 235 раз
Поблагодарили: 147 раз
Контактная информация:

Re: Нейроуправление выключателем

Сообщение lanket » Чт май 31, 2018 5:43 pm

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

Думаю уже стоит нажать галочку хранить историю чтобы когда будет готов модуль скормить ему уже готовые данные для обучения.

Отправлено с моего Redmi Note 4 через Tapatalk

Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: GitHub терминала
:arrow: GitHub модуля для МД
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
C_3AXAPOB
Сообщения: 455
Зарегистрирован: Ср июн 08, 2016 4:17 pm
Благодарил (а): 104 раза
Поблагодарили: 87 раз

Re: Нейроуправление выключателем

Сообщение C_3AXAPOB » Чт май 31, 2018 5:49 pm

lanket писал(а):
Чт май 31, 2018 5:43 pm
Можно даже немного упростить задачу обучения нейросети, поставить тем свойствам объектов который участвуют в обучении хранить историю, а потом уже готовую историю скормить интеллекту.

Думаю уже стоит нажать галочку хранить историю чтобы когда будет готов модуль скормить ему уже готовые данные для обучения.

Отправлено с моего Redmi Note 4 через Tapatalk
Именно так я и планировал сделать, историю не надо вводить вручную. Сеть должна обучаться на истории свойств объектов из МДМ.

Управление вытяжкой я взял для наглядности примера.

Теоретически нейросеть может управлять чем угодно.
Например, светом по истории датчика движения и времени суток и состояния выключателя, телевизором по времени и просматриваемым каналам(если вы в одно и тоже время смотрите определенный канал) и многим другим. Жизнь человека состоит из циклов(день, неделя, год). Каждое утро просыпаясь мы делаем одни и те же вещи, наблюдая за рутиной дом будет учиться делать что-то за хозяина.
olehs
Сообщения: 1023
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 76 раз
Поблагодарили: 294 раза

Re: Нейроуправление выключателем

Сообщение olehs » Чт май 31, 2018 7:11 pm

Очень интересная тема. И спасибо за пример реализации !

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

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

В любом случае надо поиграться с этим всем, но только сначала придумать, чем таким поуправлять, чтобы не сильно важным, и ошибки не очень раздражали всех ))
Logrus
Сообщения: 1081
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 211 раз
Поблагодарили: 158 раз

Re: Нейроуправление выключателем

Сообщение Logrus » Чт май 31, 2018 7:35 pm

поливалку, на входе продолжительность дня, уровень освещенности, температура и влажность в помещении/на улице
реализовать виртуально, на продолжительность нажатия
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо - ТАМ =>
connect Raspberry Pi3, с образа от Сергея 3.31, PHP 7
Ответить