Использование нейросети обученной на реальных данных для управления объектом
Дисклеймер!
Зачем? Потому что так интереснее!
За основу заметки взята статья 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
Санкт-Петербург, Россия
На форуме: C_3AXAPOB