Логин или email:
Пароль:
Зайти через вконтакте
Зайти через тест аккаунт
Навигация:
Панель управления оформлением проекта
Все статьи по теме: Нейропрограммирование

Нейросеть на php. Определяет русские буквы от остальных

Нейросеть на php. Определяет русские буквы от остальных

Комментарии в коде. Всё разложено по полочкам. Для теста можно зарегистрироваться на хостинге beget.ru и проверить правильность его работы.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Нейросеть</title>
</head>
<body>
<?php
/*
Пример нейронной сети, которая учится отличать
маленькие русские буквы от всех остальных.
Язык - php.
*/
class S { // глаза сети. Каждый глазик видит свою часть данных. Глазки - биты
var $input=0;
}
class A { // нейроны
var $inputWeights=array(); // нейрон связан с каждым глазом с разной силой.
var $active=0;
/*
нейрон получает от всех глаз данные, единицу или ноль.
Умножаем на силу связи глаз-нейрон, считаем среднее,
сравниваем с 0.2 - это число выбрано интуитивно. Можно задать в пределах от 0.01 до 1
Если поставить 1, сети потребуется в 4-5 раз больше обучающих примеров.
*/
function think($s){
reset($this->inputWeights);//перенос к 1му элементу
$this->active=0;
while($temp=each($s)) {
$temp2=each($this->inputWeights);
$this->active+=($temp[1]->input)*$temp2[1];////////умножаем вес глаза на значение глаза и суммируем их
}
$this->active/=count($s);//////находим средний вес суммы весов глазиков
$this->active=($this->active > 0.2);/////если вес больше 0.2, то предполагаем, что буква маленькая
}
/*
при создании нейрона связываем с глазами случайным образом.
*/
function __construct($s){
$this->inputWeights=array();
reset($s);
while($temp=each($s)) {
$this->inputWeights[]=mt_rand(0,100)/100;//////рандомно даётся сила между глазом и нейроном
}
}
}

class R { // Решатель. Смотрит, что пришло от нейронов, считает среднее, выдаёт ответ.
var $answer=array();
function think($a){
$this->answer=array();
while($temp=each($a)) {
$this->answer[]=$temp[1]->active; ////-создаем массив, в котором предположения нейронов
}
return ((array_sum($this->answer)/count($this->answer)) > 0.5);
//-если большая часть нейронов имеет значение 1, то выводим ответ = 1
}
}

$s=array();////////////////-тут будет массив глаз
$a=array();////////////////-тут будет список нейронов с его силой к каждому глазу

// В символе восемь бит. Сделаем 8 глаз.
for($q=0;$q<8;$q++) $s[$q]=new S();
/*
Cделаем 5 нейронов. Собственно, для решения этой задачи достаточно
одного нейрона, он нормально обучается. Стоит 5 просто для примера.
*/
$kol_neir = 5;
for($q=0;$q<$kol_neir;$q++) $a[$q]=new A($s);
/*
Образуется массив с рандомными числами
Array (
[0] => A Object ( ///////////[0] - 1ый нейрон
[inputWeights] => Array (
[0] => 0.64 /////-сила глазика
[1] => 0.62
[2] => 0.32
[3] => 0.79
[4] => 0.73
[5] => 0.97
[6] => 0.51
[7] => 0.16
)
[active] => 0
)
)
*/
$r=new R();

$correct=0;
for($ww=0;$ww<10000;$ww++){ // просто цикл. Прогоняем пока не ответит 500 раз правильно

$input=rand(0,255);////русский буквы находятся в этом диапазоне по таблице ASCII
/*
Буква ё сложная для обучения, у неё код символа далеко от остальных русских букв.
Поэтому увеличим частоту её выпадания.
*/
if (rand(1,100)==1) $input=ord('ё');
// правильный ответ нужен для процесса обучения.
//-поэтому проверяем находится ли цифра $input в диапазоне русских букв
//$answer=((($input<=ord('я'))AND($input>=ord('а')))OR(ord('ё')==$input));
$answer=preg_match('/[а-яё]/',$input);
// ну или preg_match('/[а-яё]/',$input);, кому так понятнее.
//-$answer становится либо 1 либо 0

for($q=0;$q<8;$q++) $s[$q]->input=($input & pow(2,$q)) >> $q; // глазки смотрят. Заносим в каждый глазик 0 или 1

/*
Образуется массив с обозначением рандомной буквы. Этот массив перезаписывается после каждой итерации цикла $ww
Array (
[0] => S Object ( [input] => 1 )
[1] => S Object ( [input] => 0 )
[2] => S Object ( [input] => 0 )
[3] => S Object ( [input] => 0 )
[4] => S Object ( [input] => 1 )
[5] => S Object ( [input] => 0 )
[6] => S Object ( [input] => 1 )
[7] => S Object ( [input] => 0 )
)
*/
for($q=0;$q<$kol_neir;$q++) $a[$q]->think($s); // нейроны думают.
/* образуется массив с предположением, если active=1, то русская буква явл маленькая
Array (
[0] => A Object (
[inputWeights] => Array (
[0] => 0.35
[1] => 0.22
[2] => 0.93
[3] => 0.2
[4] => 0.92
[5] => 0.04
[6] => 0.1
[7] => 0.99
)
[active] => 1
)
[1] => A Object (
[inputWeights] => Array (
[0] => 0.35
[1] => 0.22
[2] => 0.93
[3] => 0.2
[4] => 0.92
[5] => 0.04
[6] => 0.1
[7] => 0.99
)
[active] => 1
)
итд, в зависимости от количества нейронов
)
*/
/*
Процесс обучения.
Для каждого нейрона смотрим, ответил ли он правильно.
Почему нейрон ошибается? Потому что не знает, от каких глаз данные важнее.
Например, если старший бит ноль, то русской буквой символ точно быть не может.
Этого нейрон не поймёт, но научиться, что данные от старшего бита важнее, он может.
Изменяем силу связи с теми глазами, которые видели единицу.
Единицы от одних глаз станут влиять на результат сильнее, от других - слабее.
$a[$q]->active = 0 или 1
$answer = если строчная русская буква, то выдает 1
*/
for($q=0;$q<$kol_neir;$q++) if ($a[$q]->active != $answer) {
foreach($a[$q]->inputWeights as $k=>$v){
if ($s[$k]->input) {////-если глазик = 1
$a[$q]->inputWeights[$k]+=(($answer)?0.01:-0.01);
////если $answer=1(маленькая русская буква), то увеличиваем inputWeight(вес глазика), иначе уменьшаем
}
}
}
$think=$r->think($a);
// считаем, сколько раз подряд ответили верно.
if ($think == $answer) {
$correct++;
echo ' '.chr($input).'';
} else {
$correct=0;
}
//echo (int)$think;
//echo (int)$answer;

if ($correct>500) {
echo "Для обучения сети потребовалось $ww обучающих примеров.";
break;
}
}

//var_dump($s);
//var_dump($a);
//var_dump($r);
?>
</body>
</html>

Теги:

нейросеть, нейропрограммирование, php, искусственный интелект на php, ии, Нейросеть ООП

Средняя оценка статьи: 3.33 балл
Назад
1 из 1
Вперед
569
Статья подготовлена пользователем:
Рейтинг: 0.00
Все статьи по теме: Нейропрограммирование