C_3AXAPOB

<<< Back

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

Использование нейросети обученной на реальных данных для управления объектом

Дисклеймер!
Зачем? Потому что так интереснее!
За основу заметки взята статья 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);
?>

Запускаем!

Входные данные: -1,50 день, влажность 50 процентов
Решение:

С параметрами помещения:
День
Влажность (50.00)
Надо включить вытяжку (0.99).

Еще раз, день, влажность 30 процентов
Решение:

С параметрами помещения:
День
Влажность (30.00)
Вытяжку включать не надо (-1.00).

Ну и еще разок, день, влажность 60 процентов

С параметрами помещения:
День
Влажность (60.00)
Надо включить вытяжку (0.88).

Ссылка на архив с примером https://yadi.sk/d/AQONSDrP3Wg7FC

Discuss (0) (4)

See also:
2018-07-04 Создание и управление 3D сценой (Обновено!)
2018-06-07 Детектор лиц на PHP без использования OpenCV

Санкт-Петербург, Россия