Страница 1 из 5

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

Добавлено: Вт май 29, 2018 11:24 pm
C_3AXAPOB
**Дисклеймер!
Использование нейросети обученной на реальных* данных для управления объектом
Зачем? Потому что так интереснее!
За основу заметки взята статья 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

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

Добавлено: Ср май 30, 2018 9:25 am
webms
нифига не понял)
а зачем такие сложности если можно вкл и выкл вытяжку просто условием if

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

Добавлено: Ср май 30, 2018 9:57 am
xor
Ну, это просто пример.
Интересен был бы модуль сбора обучающих данных для сети, типа пользователь выбирает свойства объектов системы:
день недели, время, сработка датчиков движения, включ/выкл света пользователем -- спустя некоторое время нейросеть будет иметь данные для частых маршрутов по помещению для вкл света и тп

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

Добавлено: Ср май 30, 2018 10:06 am
C_3AXAPOB
webms писал(а):
Ср май 30, 2018 9:25 am
нифига не понял)
а зачем такие сложности если можно вкл и выкл вытяжку просто условием if
Можно. Но так интереснее. В данном случае можно дом не программировать а учить, т.е. он наблюдает за вами, видит
когда была включена вытяжка и при каких условиях и при повторении условий уже сам включит вытяжку.

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

Добавлено: Ср май 30, 2018 10:26 am
tarasfrompir
webms писал(а):
Ср май 30, 2018 9:25 am
нифига не понял)
а зачем такие сложности если можно вкл и выкл вытяжку просто условием if
Да все даже очень правильно - как по мне это перспективное направление...

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

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

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

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


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

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

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

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


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

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

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

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

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

Теоретически нейросеть может управлять чем угодно.
Например, светом по истории датчика движения и времени суток и состояния выключателя, телевизором по времени и просматриваемым каналам(если вы в одно и тоже время смотрите определенный канал) и многим другим. Жизнь человека состоит из циклов(день, неделя, год). Каждое утро просыпаясь мы делаем одни и те же вещи, наблюдая за рутиной дом будет учиться делать что-то за хозяина.

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

Добавлено: Чт май 31, 2018 7:11 pm
olehs
Очень интересная тема. И спасибо за пример реализации !

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

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

В любом случае надо поиграться с этим всем, но только сначала придумать, чем таким поуправлять, чтобы не сильно важным, и ошибки не очень раздражали всех ))

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

Добавлено: Чт май 31, 2018 7:35 pm
Logrus
поливалку, на входе продолжительность дня, уровень освещенности, температура и влажность в помещении/на улице
реализовать виртуально, на продолжительность нажатия